Skip to content

Commit 2a0c55a

Browse files
authored
Fix Json.Num.apply for floats, doubles and java.math.BigInteger (#1299)
1 parent 92955bb commit 2a0c55a

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

zio-json/shared/src/main/scala/zio/json/ast/ast.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -536,10 +536,10 @@ object Json {
536536
if (value.isValidLong) apply(value.toLong)
537537
else new Json.Num(new java.math.BigDecimal(value.bigInteger))
538538
def apply(value: java.math.BigInteger): Num =
539-
if (value.bitCount < 64) apply(value.longValue)
539+
if (value.bitLength < 64) apply(value.longValue)
540540
else new Json.Num(new java.math.BigDecimal(value))
541-
def apply(value: Float): Num = new Num(new java.math.BigDecimal(value.toString))
542-
def apply(value: Double): Num = new Num(new java.math.BigDecimal(value))
541+
def apply(value: Float): Num = new Num(new java.math.BigDecimal(SafeNumbers.toString(value)))
542+
def apply(value: Double): Num = new Num(new java.math.BigDecimal(SafeNumbers.toString(value)))
543543

544544
implicit val decoder: JsonDecoder[Num] = new JsonDecoder[Num] {
545545
def unsafeDecode(trace: List[JsonError], in: RetractReader): Num =

zio-json/shared/src/test/scala/zio/json/ast/JsonSpec.scala

+21
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,32 @@ import zio.json._
55
import zio.test.Assertion._
66
import zio.test._
77

8+
import java.math.BigInteger
9+
810
object JsonSpec extends ZIOSpecDefault {
911

1012
val spec: Spec[Environment, Any] =
1113
suite("Json")(
1214
suite("apply")(
15+
test("Num()") {
16+
assertTrue(Json.Num(0).toString == "0") &&
17+
assertTrue(Json.Num(0.0).toString == "0.0") &&
18+
assertTrue(Json.Num(1.0).toString == "1.0") &&
19+
assertTrue(Json.Num(-0.0).toString == "0.0") &&
20+
assertTrue(Json.Num(-1.0).toString == "-1.0") &&
21+
assertTrue(Json.Num(7: Byte).toString == "7") &&
22+
assertTrue(Json.Num(777: Short).toString == "777") &&
23+
assertTrue(Json.Num(123456789).toString == "123456789") &&
24+
assertTrue(Json.Num(1.2345678f).toString == "1.2345678") &&
25+
assertTrue(Json.Num(1.2345678901234567).toString == "1.2345678901234567") &&
26+
assertTrue(Json.Num(1234567890123456789L).toString == "1234567890123456789") &&
27+
assertTrue(Json.Num(BigInteger.valueOf(1234567890123456789L)).toString == "1234567890123456789") &&
28+
assertTrue(Json.Num(new BigInteger("12345678901234567890")).toString == "12345678901234567890") &&
29+
assertTrue(Json.Num(BigInt(1234567890123456789L)).toString == "1234567890123456789") &&
30+
assertTrue(Json.Num(BigInt("12345678901234567890")).toString == "12345678901234567890") &&
31+
assertTrue(Json.Num(BigDecimal(1234567890123456789L)).toString == "1234567890123456789") &&
32+
assertTrue(Json.Num(BigDecimal("12345678901234567890")).toString == "12345678901234567890")
33+
},
1334
test("Bool()") {
1435
assertTrue(Json.Bool.True eq Json.Bool(true)) &&
1536
assertTrue(Json.Bool.False eq Json.Bool(false))

0 commit comments

Comments
 (0)