From 8561b9fd1fa29b076b58b2815fad0e50254524b6 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 8 Mar 2024 17:46:42 -0500 Subject: [PATCH 1/2] fix long getting casted to double --- .../java/org/example/UnknownNumberTest.java | 30 +++++++++++++++++++ .../avaje/jsonb/core/BasicTypeAdapters.java | 5 +++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 blackbox-test/src/test/java/org/example/UnknownNumberTest.java diff --git a/blackbox-test/src/test/java/org/example/UnknownNumberTest.java b/blackbox-test/src/test/java/org/example/UnknownNumberTest.java new file mode 100644 index 00000000..64a913b4 --- /dev/null +++ b/blackbox-test/src/test/java/org/example/UnknownNumberTest.java @@ -0,0 +1,30 @@ +package org.example; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import io.avaje.jsonb.JsonType; +import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.Types; + +class UnknownNumberTest { + + Jsonb jsonb = Jsonb.builder().build(); + + JsonType>> listMapType = + jsonb.type(Types.listOf(Types.mapOf(Object.class))); + + @Test + void testIntegerParsing() { + + String input = "[ {\"food\": \"sushi\", \"amount\": 5}]"; + + List> l = listMapType.fromJson(input); + assertThat("5").isEqualTo(l.get(0).get("amount").toString()); + assertThat("sushi").isEqualTo(l.get(0).get("amount").toString()); + } +} diff --git a/jsonb/src/main/java/io/avaje/jsonb/core/BasicTypeAdapters.java b/jsonb/src/main/java/io/avaje/jsonb/core/BasicTypeAdapters.java index ed2e2ea1..30c574d7 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/core/BasicTypeAdapters.java +++ b/jsonb/src/main/java/io/avaje/jsonb/core/BasicTypeAdapters.java @@ -393,7 +393,10 @@ public Object fromJson(JsonReader reader) { return this.stringAdapter.fromJson(reader); case NUMBER: var d = this.doubleAdapter.fromJson(reader); - return (d % 1 == 0) ? d.longValue() : d; + if (d % 1 == 0) { + return d.longValue(); + } + return d; case BOOLEAN: return this.booleanAdapter.fromJson(reader); case NULL: From 123fe94bce48e6bbf7b428f46fc809f464d2658f Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 8 Mar 2024 18:04:28 -0500 Subject: [PATCH 2/2] fix tests --- .../java/org/example/UnknownNumberTest.java | 30 ------------------- .../org/example/other/ObjectAdapterTest.java | 25 ++++++++++++---- 2 files changed, 19 insertions(+), 36 deletions(-) delete mode 100644 blackbox-test/src/test/java/org/example/UnknownNumberTest.java diff --git a/blackbox-test/src/test/java/org/example/UnknownNumberTest.java b/blackbox-test/src/test/java/org/example/UnknownNumberTest.java deleted file mode 100644 index 64a913b4..00000000 --- a/blackbox-test/src/test/java/org/example/UnknownNumberTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.example; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -import io.avaje.jsonb.JsonType; -import io.avaje.jsonb.Jsonb; -import io.avaje.jsonb.Types; - -class UnknownNumberTest { - - Jsonb jsonb = Jsonb.builder().build(); - - JsonType>> listMapType = - jsonb.type(Types.listOf(Types.mapOf(Object.class))); - - @Test - void testIntegerParsing() { - - String input = "[ {\"food\": \"sushi\", \"amount\": 5}]"; - - List> l = listMapType.fromJson(input); - assertThat("5").isEqualTo(l.get(0).get("amount").toString()); - assertThat("sushi").isEqualTo(l.get(0).get("amount").toString()); - } -} diff --git a/blackbox-test/src/test/java/org/example/other/ObjectAdapterTest.java b/blackbox-test/src/test/java/org/example/other/ObjectAdapterTest.java index 7d7b7ece..c86b4082 100644 --- a/blackbox-test/src/test/java/org/example/other/ObjectAdapterTest.java +++ b/blackbox-test/src/test/java/org/example/other/ObjectAdapterTest.java @@ -4,6 +4,8 @@ import io.avaje.jsonb.JsonType; import io.avaje.jsonb.JsonWriter; import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.Types; + import org.junit.jupiter.api.Test; import java.io.StringWriter; @@ -68,7 +70,7 @@ void mixedArray() { Object val = objectType.fromJson("[42,false,true,\"hi\",true]"); assertThat(val).isInstanceOf(List.class); List list = (List) val; - assertThat(list).isEqualTo(List.of(42.0, false, true, "hi", true)); + assertThat(list).isEqualTo(List.of(42L, false, true, "hi", true)); } @SuppressWarnings("unchecked") @@ -79,7 +81,7 @@ void fromJson_readingMap() { assertThat(value).isInstanceOf(Map.class); Map asMap = (Map) value; - assertThat(asMap.get("id")).isEqualTo(42D); + assertThat(asMap.get("id")).isEqualTo(42L); assertThat(asMap.get("name")).isEqualTo("rob"); Object fromJsonViaType = objectType.fromJson("{\"id\":42,\"name\":\"rob\"}"); @@ -96,7 +98,7 @@ void fromJson_readingListOfMap() { List> asListOfMap = (List>) value; assertThat(asListOfMap).hasSize(2); - assertThat(asListOfMap.get(0).get("id")).isEqualTo(42D); + assertThat(asListOfMap.get(0).get("id")).isEqualTo(42L); assertThat(asListOfMap.get(0).get("name")).isEqualTo("rob"); StringWriter sw = new StringWriter(); @@ -105,12 +107,12 @@ void fromJson_readingListOfMap() { jsonWriter.close(); String asJson = sw.toString(); - assertThat(asJson).isEqualTo("[{\"id\":42.0,\"name\":\"rob\"},{\"id\":43.0,\"name\":\"bob\"}]"); + assertThat(asJson).isEqualTo("[{\"id\":42,\"name\":\"rob\"},{\"id\":43,\"name\":\"bob\"}]"); // a bit easier using JsonType compared to JsonAdapter String asJson2 = objectType.toJson(value); - assertThat(asJson2).isEqualTo("[{\"id\":42.0,\"name\":\"rob\"},{\"id\":43.0,\"name\":\"bob\"}]"); + assertThat(asJson2).isEqualTo("[{\"id\":42,\"name\":\"rob\"},{\"id\":43,\"name\":\"bob\"}]"); } @SuppressWarnings("unchecked") @@ -130,8 +132,19 @@ void readingNested() { var entry = (Map) list.get(0); assertThat(entry).hasSize(3); - assertThat(entry.get("path")).isEqualTo(42.0D); + assertThat(entry.get("path")).isEqualTo(42L); assertThat(entry.get("property")).isEqualTo("foo"); assertThat(entry.get("message")).isEqualTo("must not be blank"); } + + @Test + void testIntegerParsing() { + + JsonType>> listMapType = + jsonb.type(Types.listOf(Types.mapOf(Object.class))); + String input = "[ {\"food\": \"sushi\", \"amount\": 5}]"; + + List> l = listMapType.fromJson(input); + assertThat("5").isEqualTo(l.get(0).get("amount").toString()); + } }