From ada597e69a78b8b99f79f79493cbf51e16045202 Mon Sep 17 00:00:00 2001 From: Mike Date: Wed, 31 May 2017 19:50:45 +0300 Subject: [PATCH] value(double) can write NaN and infinite values when lenient, as value(Number) does (#1093) * Added test which shows that lenient JsonWriter fails writing infinite primitive doubles, but does not fail writing boxed doubles, as stated in #1090. * Fixed JsonWriter#value(double) to write infinite and NaN values when lenient, as JsonWriter#value(Number) does. (fixes #1090) --- .../com/google/gson/stream/JsonWriter.java | 4 +-- .../google/gson/stream/JsonWriterTest.java | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/gson/src/main/java/com/google/gson/stream/JsonWriter.java b/gson/src/main/java/com/google/gson/stream/JsonWriter.java index e2fc1961..8148816c 100644 --- a/gson/src/main/java/com/google/gson/stream/JsonWriter.java +++ b/gson/src/main/java/com/google/gson/stream/JsonWriter.java @@ -491,10 +491,10 @@ public class JsonWriter implements Closeable, Flushable { * @return this writer. */ public JsonWriter value(double value) throws IOException { - if (Double.isNaN(value) || Double.isInfinite(value)) { + writeDeferredName(); + if (!lenient && (Double.isNaN(value) || Double.isInfinite(value))) { throw new IllegalArgumentException("Numeric values must be finite, but was " + value); } - writeDeferredName(); beforeValue(); out.append(Double.toString(value)); return this; diff --git a/gson/src/test/java/com/google/gson/stream/JsonWriterTest.java b/gson/src/test/java/com/google/gson/stream/JsonWriterTest.java index 34dc9140..2bcec173 100644 --- a/gson/src/test/java/com/google/gson/stream/JsonWriterTest.java +++ b/gson/src/test/java/com/google/gson/stream/JsonWriterTest.java @@ -16,11 +16,12 @@ package com.google.gson.stream; +import junit.framework.TestCase; + import java.io.IOException; import java.io.StringWriter; import java.math.BigDecimal; import java.math.BigInteger; -import junit.framework.TestCase; @SuppressWarnings("resource") public final class JsonWriterTest extends TestCase { @@ -213,6 +214,30 @@ public final class JsonWriterTest extends TestCase { } } + public void testNonFiniteDoublesWhenLenient() throws IOException { + StringWriter stringWriter = new StringWriter(); + JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setLenient(true); + jsonWriter.beginArray(); + jsonWriter.value(Double.NaN); + jsonWriter.value(Double.NEGATIVE_INFINITY); + jsonWriter.value(Double.POSITIVE_INFINITY); + jsonWriter.endArray(); + assertEquals("[NaN,-Infinity,Infinity]", stringWriter.toString()); + } + + public void testNonFiniteBoxedDoublesWhenLenient() throws IOException { + StringWriter stringWriter = new StringWriter(); + JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setLenient(true); + jsonWriter.beginArray(); + jsonWriter.value(Double.valueOf(Double.NaN)); + jsonWriter.value(Double.valueOf(Double.NEGATIVE_INFINITY)); + jsonWriter.value(Double.valueOf(Double.POSITIVE_INFINITY)); + jsonWriter.endArray(); + assertEquals("[NaN,-Infinity,Infinity]", stringWriter.toString()); + } + public void testDoubles() throws IOException { StringWriter stringWriter = new StringWriter(); JsonWriter jsonWriter = new JsonWriter(stringWriter);