From 1885ba7dec27dd99fd8c9dc48bb6623708286584 Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Thu, 4 Aug 2011 23:12:49 +0000 Subject: [PATCH] Restore support for serializeSpecialFloatingPointValues. --- gson/src/main/java/com/google/gson/Gson.java | 43 ++++++++++++++++++- .../google/gson/internal/bind/MiniGson.java | 1 + .../gson/internal/bind/TypeAdapters.java | 12 ++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 4c2b079a..134215ed 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -212,7 +212,10 @@ public final class Gson { .withoutDefaultFactories() .factory(TypeAdapters.BOOLEAN_FACTORY) .factory(TypeAdapters.INTEGER_FACTORY) - .factory(TypeAdapters.DOUBLE_FACTORY) + .factory(TypeAdapters.newFactory(double.class, Double.class, + doubleAdapter(serializeSpecialFloatingPointValues))) + .factory(TypeAdapters.newFactory(float.class, Float.class, + floatAdapter(serializeSpecialFloatingPointValues))) .factory(TypeAdapters.newFactory(long.class, Long.class, longAdapter(longSerializationPolicy))) .factory(TypeAdapters.STRING_FACTORY) @@ -225,6 +228,44 @@ public final class Gson { this.miniGson = builder.build(); } + private TypeAdapter doubleAdapter(boolean serializeSpecialFloatingPointValues) { + if (serializeSpecialFloatingPointValues) { + return TypeAdapters.DOUBLE; + } + return new TypeAdapter() { + @Override public Double read(JsonReader reader) throws IOException { + return reader.nextDouble(); + } + @Override public void write(JsonWriter writer, Double value) throws IOException { + checkValidFloatingPoint(value); + writer.value(value); + } + }; + } + + private TypeAdapter floatAdapter(boolean serializeSpecialFloatingPointValues) { + if (serializeSpecialFloatingPointValues) { + return TypeAdapters.FLOAT; + } + return new TypeAdapter() { + @Override public Float read(JsonReader reader) throws IOException { + return (float) reader.nextDouble(); + } + @Override public void write(JsonWriter writer, Float value) throws IOException { + checkValidFloatingPoint(value); + writer.value(value); + } + }; + } + + private void checkValidFloatingPoint(double value) { + if (Double.isNaN(value) || Double.isInfinite(value)) { + throw new IllegalArgumentException(value + + " is not a valid double value as per JSON specification. To override this" + + " behavior, use GsonBuilder.serializeSpecialDoubleValues() method."); + } + } + private TypeAdapter longAdapter(LongSerializationPolicy longSerializationPolicy) { if (longSerializationPolicy == LongSerializationPolicy.DEFAULT) { return TypeAdapters.LONG; diff --git a/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java b/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java index 03fbef0c..29b6350c 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java +++ b/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java @@ -53,6 +53,7 @@ public final class MiniGson { factories.add(TypeAdapters.BOOLEAN_FACTORY); factories.add(TypeAdapters.INTEGER_FACTORY); factories.add(TypeAdapters.DOUBLE_FACTORY); + factories.add(TypeAdapters.FLOAT_FACTORY); factories.add(TypeAdapters.LONG_FACTORY); factories.add(TypeAdapters.STRING_FACTORY); } diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 0baed306..c6e6566c 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -75,6 +75,18 @@ public final class TypeAdapters { public static final TypeAdapter.Factory DOUBLE_FACTORY = newFactory(double.class, Double.class, DOUBLE); + public static final TypeAdapter FLOAT = new TypeAdapter() { + public Float read(JsonReader reader) throws IOException { + return (float) reader.nextDouble(); + } + public void write(JsonWriter writer, Float value) throws IOException { + writer.value(value); + } + }; + + public static final TypeAdapter.Factory FLOAT_FACTORY + = newFactory(float.class, Float.class, FLOAT); + public static final TypeAdapter STRING = new TypeAdapter() { public String read(JsonReader reader) throws IOException { return reader.nextString();