Skip to content

Commit 7ed15df

Browse files
committed
fixup
1 parent e152410 commit 7ed15df

2 files changed

Lines changed: 39 additions & 24 deletions

File tree

play-json/jvm/src/main/scala/play/api/libs/json/jackson/JacksonJson.scala

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,22 @@ private[jackson] class JsValueSerializer(jsonConfig: JsonConfig) extends ValueSe
8282
val va = v.abs
8383
va <= jsonConfig.bigDecimalSerializerConfig.maxPlain && va >= jsonConfig.bigDecimalSerializerConfig.minPlain
8484
}
85-
val stripped = stripTrailingZeros(v.bigDecimal)
86-
val raw = if (shouldWritePlain) stripped.toPlainString else stripped.toString
87-
88-
if (raw.exists(c => c == 'E' || c == '.'))
89-
json.writeNumber(raw)
90-
else
91-
json match {
92-
case tb: TokenBuffer =>
93-
tb.writeNumber(raw, true)
94-
case _ =>
95-
json.writeNumber(raw)
96-
}
85+
val stripped = stripTrailingZeros(v.bigDecimal)
86+
val (raw, rawAsBigDecimal) = if (shouldWritePlain) {
87+
val str = stripped.toPlainString
88+
(str, new JBigDec(str))
89+
} else {
90+
(stripped.toString, stripped)
91+
}
92+
93+
json match {
94+
case tb: TokenBuffer =>
95+
// If the JsonGenerator is a TokenBuffer, use its writeNumber specific method
96+
val isInteger = raw.forall(c => c != 'E' && c != '.')
97+
tb.writeNumber(raw, isInteger)
98+
case _ =>
99+
json.writeNumber(rawAsBigDecimal)
100+
}
97101
}
98102

99103
case JsString(v) => json.writeString(v)

play-json/jvm/src/test/scala/play/api/libs/json/JsonSpec.scala

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import java.math.BigInteger
1010
import java.util.Calendar
1111
import java.util.Date
1212
import java.util.TimeZone
13-
1413
import tools.jackson.databind.JsonNode
1514
import tools.jackson.databind.ObjectMapper
1615
import play.api.libs.functional.syntax._
1716
import play.api.libs.json.Json._
1817
import play.api.libs.json.jackson.JacksonJson
18+
import tools.jackson.databind.node.{ ArrayNode, BigIntegerNode, DoubleNode, NumericNode, ObjectNode }
1919

2020
class JsonSpec extends org.specs2.mutable.Specification {
2121

@@ -469,36 +469,47 @@ class JsonSpec extends org.specs2.mutable.Specification {
469469
}
470470

471471
"Serialize and deserialize Jackson ObjectNodes" in {
472-
val on = mapper
472+
val on: ObjectNode = mapper
473473
.createObjectNode()
474474
.put("foo", 1)
475475
.put("bar", "two")
476-
val json = Json.obj("foo" -> 1, "bar" -> "two")
477-
476+
val json = Json.obj("foo" -> 1, "bar" -> "two")
477+
val deserialized: JsResult[JsonNode] = fromJson[JsonNode](json)
478478
toJson(on).must_==(json) and (
479-
fromJson[JsonNode](json).map(_.toString).must_==(JsSuccess(on.toString))
479+
deserialized.map(_.isInstanceOf[ObjectNode]).must_==(JsSuccess(true))
480+
) and (
481+
deserialized.map(_.toString).must_==(JsSuccess(on.toString))
480482
)
481483
}
482484

483485
"Serialize and deserialize Jackson ArrayNodes" in {
484-
val an = mapper
486+
val an: ArrayNode = mapper
485487
.createArrayNode()
486488
.add("one")
487489
.add(2)
488-
val json = Json.arr("one", 2)
490+
val json = Json.arr("one", 2)
491+
val deserialized: JsResult[JsonNode] = fromJson[JsonNode](json)
489492
toJson(an).must(equalTo(json)) and (
490-
fromJson[JsonNode](json).map(_.toString).must_==(JsSuccess(an.toString))
493+
deserialized.map(_.isInstanceOf[ArrayNode]).must_==(JsSuccess(true))
494+
) and (
495+
deserialized.map(_.toString).must_==(JsSuccess(an.toString))
491496
)
492497
}
493498

494499
"Deserialize integer JsNumber as Jackson number node" in {
495-
val jsNum = JsNumber(new java.math.BigDecimal("50"))
496-
fromJson[JsonNode](jsNum).map(_.toString).must_==(JsSuccess("50"))
500+
val jsNum = JsNumber(new java.math.BigDecimal("50"))
501+
val deserialized: JsResult[JsonNode] = fromJson[JsonNode](jsNum)
502+
deserialized.map(_.isInstanceOf[NumericNode]).must_==(JsSuccess(true)) and (
503+
deserialized.map(_.toString).must_==(JsSuccess("50"))
504+
)
497505
}
498506

499507
"Deserialize float JsNumber as Jackson number node" in {
500-
val jsNum = JsNumber(new java.math.BigDecimal("12.345"))
501-
fromJson[JsonNode](jsNum).map(_.toString).must_==(JsSuccess("12.345"))
508+
val jsNum = JsNumber(new java.math.BigDecimal("12.345"))
509+
val deserialized: JsResult[JsonNode] = fromJson[JsonNode](jsNum)
510+
deserialized.map(_.isInstanceOf[NumericNode]).must_==(JsSuccess(true)) and (
511+
deserialized.map(_.toString).must_==(JsSuccess("12.345"))
512+
)
502513
}
503514

504515
"Serialize JsNumbers with integers correctly" in {

0 commit comments

Comments
 (0)