Skip to content

Commit

Permalink
Add explicit support for floats in JsonTreeWriter.
Browse files Browse the repository at this point in the history
Follow-up to comments on #2130, which introduced a new override which was not overridden by JsonTreeWriter. Also tweaks the doccomments for both float and double varients of JsonWriter.value.

Supplement to the fix for #1127.
  • Loading branch information
Capstan committed Jun 10, 2022
1 parent 96ab171 commit 439db9d
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 5 deletions.
Expand Up @@ -170,6 +170,14 @@ private void put(JsonElement value) {
return this;
}

@Override public JsonWriter value(float value) throws IOException {
if (!isLenient() && (Float.isNaN(value) || Float.isInfinite(value))) {
throw new IllegalArgumentException("JSON forbids NaN and infinities: " + value);
}
put(new JsonPrimitive(value));
return this;
}

@Override public JsonWriter value(double value) throws IOException {
if (!isLenient() && (Double.isNaN(value) || Double.isInfinite(value))) {
throw new IllegalArgumentException("JSON forbids NaN and infinities: " + value);
Expand Down
9 changes: 5 additions & 4 deletions gson/src/main/java/com/google/gson/stream/JsonWriter.java
Expand Up @@ -493,8 +493,9 @@ public JsonWriter value(Boolean value) throws IOException {
/**
* Encodes {@code value}.
*
* @param value a finite value. May not be {@link Float#isNaN() NaNs} or {@link Float#isInfinite()
* infinities}.
* @param value a finite value, or if {@link #setLenient(boolean) lenient},
* also {@link Float#isNaN() NaN} or {@link Float#isInfinite()
* infinity}.
* @return this writer.
* @throws IllegalArgumentException if the value is NaN or Infinity and this writer is not {@link
* #setLenient(boolean) lenient}.
Expand All @@ -512,8 +513,8 @@ public JsonWriter value(float value) throws IOException {
/**
* Encodes {@code value}.
*
* @param value a finite value. May not be {@link Double#isNaN() NaNs} or
* {@link Double#isInfinite() infinities}.
* @param value a finite value, or if {@link #setLenient(boolean) lenient},
* also {@link Double#isNaN() NaN} or {@link Double#isInfinite() infinity}.
* @return this writer.
* @throws IllegalArgumentException if the value is NaN or Infinity and this writer is
* not {@link #setLenient(boolean) lenient}.
Expand Down
Expand Up @@ -152,17 +152,35 @@ public void testLenientNansAndInfinities() throws IOException {
JsonTreeWriter writer = new JsonTreeWriter();
writer.setLenient(true);
writer.beginArray();
writer.value(Float.NaN);
writer.value(Float.NEGATIVE_INFINITY);
writer.value(Float.POSITIVE_INFINITY);
writer.value(Double.NaN);
writer.value(Double.NEGATIVE_INFINITY);
writer.value(Double.POSITIVE_INFINITY);
writer.endArray();
assertEquals("[NaN,-Infinity,Infinity]", writer.get().toString());
assertEquals("[NaN,-Infinity,Infinity,NaN,-Infinity,Infinity]", writer.get().toString());
}

public void testStrictNansAndInfinities() throws IOException {
JsonTreeWriter writer = new JsonTreeWriter();
writer.setLenient(false);
writer.beginArray();
try {
writer.value(Float.NaN);
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Float.NEGATIVE_INFINITY);
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Float.POSITIVE_INFINITY);
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Double.NaN);
fail();
Expand All @@ -184,6 +202,21 @@ public void testStrictBoxedNansAndInfinities() throws IOException {
JsonTreeWriter writer = new JsonTreeWriter();
writer.setLenient(false);
writer.beginArray();
try {
writer.value(Float.valueOf(Float.NaN));
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Float.valueOf(Float.NEGATIVE_INFINITY));
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Float.valueOf(Float.POSITIVE_INFINITY));
fail();
} catch (IllegalArgumentException expected) {
}
try {
writer.value(Double.valueOf(Double.NaN));
fail();
Expand Down

0 comments on commit 439db9d

Please sign in to comment.