Skip to content

Commit 146da6f

Browse files
authored
fix: use gson 'lazily parsed number' for 'object to number' strategy (#187)
This commit makes a small change to our Gson factory so that it sets the "object to number" strategy to LAZILY_PARSED_NUMBER. The default value (DOUBLE) does not provide the fidelity needed when performing marshalling/unmarshalling steps involving generic datastructures like Map<String,Object>. Signed-off-by: Phil Adams <[email protected]>
1 parent 4a57be8 commit 146da6f

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/main/java/com/ibm/cloud/sdk/core/util/GsonSingleton.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private GsonSingleton() {
4747
*/
4848
private static Gson createGson(boolean prettyPrint, boolean serializeNulls) {
4949
GsonBuilder builder = new GsonBuilder()
50-
.setObjectToNumberStrategy(ToNumberPolicy.DOUBLE)
50+
.setObjectToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER)
5151
.setNumberToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER);
5252

5353
registerTypeAdapters(builder);

src/test/java/com/ibm/cloud/sdk/core/util/GsonSingletonTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import java.util.ArrayList;
2222
import java.util.Date;
2323
import java.util.List;
24+
import java.util.Map;
2425

2526
import org.testng.Assert;
2627
import org.testng.annotations.Test;
2728

2829
import com.google.gson.Gson;
2930
import com.google.gson.JsonSyntaxException;
31+
import com.google.gson.ToNumberPolicy;
3032
import com.google.gson.internal.LazilyParsedNumber;
3133
import com.google.gson.reflect.TypeToken;
3234

@@ -100,4 +102,18 @@ public void testLazilyParsedNumber3() {
100102
Gson gson = GsonSingleton.getGsonWithSerializeNulls();
101103
gson.fromJson(jsonString, modelType);
102104
}
105+
106+
@SuppressWarnings("unchecked")
107+
@Test
108+
public void testLazilyParsedNumber4() {
109+
Gson gson = GsonSingleton.getGsonWithoutPrettyPrinting();
110+
111+
String jsonString = "{\"foo\":38.9999,\"bar\":28.0001,\"baz\":74}";
112+
Map<String, Object> map = gson.fromJson(jsonString, Map.class);
113+
assertNotNull(map);
114+
115+
String serializedMap = gson.toJson(map);
116+
assertNotNull(serializedMap);
117+
assertEquals(serializedMap, jsonString);
118+
}
103119
}

0 commit comments

Comments
 (0)