Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add explicit support for floats in JsonTreeWriter. #2132

Merged
merged 1 commit into from Jun 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
13 changes: 7 additions & 6 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 @@ -555,8 +556,8 @@ private static boolean isTrustedNumberType(Class<? extends Number> c) {
* Encodes {@code value}. The value is written by directly writing the {@link Number#toString()}
* result to JSON. Implementations must make sure that the result represents a valid JSON number.
*
* @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}; or if the {@code toString()} result is not a
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