Skip to content

Commit 0caac27

Browse files
Fix serialization of NaN/Infinite/Min/Max values (#223) (#225)
Co-authored-by: Sylvain Wallez <sylvain@elastic.co>
1 parent 2d53ee8 commit 0caac27

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,17 +217,15 @@ public static String toString(JsonValue value) {
217217
}
218218

219219
public static void serializeDoubleOrNull(JsonGenerator generator, double value, double defaultValue) {
220-
// Only output null if the default value isn't finite, which cannot be represented as JSON
221-
if (value == defaultValue && !Double.isFinite(defaultValue)) {
220+
if (!Double.isFinite(value)) {
222221
generator.writeNull();
223222
} else {
224223
generator.write(value);
225224
}
226225
}
227226

228227
public static void serializeIntOrNull(JsonGenerator generator, int value, int defaultValue) {
229-
// Only output null if the default value isn't finite, which cannot be represented as JSON
230-
if (value == defaultValue && defaultValue == Integer.MAX_VALUE || defaultValue == Integer.MIN_VALUE) {
228+
if (value == defaultValue && (defaultValue == Integer.MAX_VALUE || defaultValue == Integer.MIN_VALUE)) {
231229
generator.writeNull();
232230
} else {
233231
generator.write(value);

java-client/src/test/java/co/elastic/clients/elasticsearch/json/JsonpUtilsTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@
2323
import co.elastic.clients.util.AllowForbiddenApis;
2424
import jakarta.json.JsonException;
2525
import jakarta.json.spi.JsonProvider;
26+
import jakarta.json.stream.JsonGenerator;
2627
import org.junit.Assert;
2728
import org.junit.Test;
2829

30+
import java.io.StringWriter;
2931
import java.net.URL;
3032
import java.util.Collections;
3133
import java.util.Enumeration;
34+
import java.util.function.Consumer;
3235

3336
public class JsonpUtilsTest extends Assert {
3437

@@ -60,4 +63,52 @@ public Enumeration<URL> getResources(String name) {
6063
Thread.currentThread().setContextClassLoader(savedLoader);
6164
}
6265
}
66+
67+
@Test
68+
public void testSerializeDoubleOrNull() {
69+
// ---- Double values
70+
assertEquals("{\"a\":null}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, Double.NaN, Double.NaN)));
71+
assertEquals("{\"a\":1.0}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, 1.0, Double.NaN)));
72+
73+
assertEquals("{\"a\":null}",
74+
orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)));
75+
assertEquals("{\"a\":1.0}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, 1.0, Double.POSITIVE_INFINITY)));
76+
77+
assertEquals("{\"a\":null}",
78+
orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)));
79+
assertEquals("{\"a\":1.0}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, 1.0, Double.NEGATIVE_INFINITY)));
80+
81+
assertEquals("{\"a\":null}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, Double.NaN, 0.0)));
82+
83+
// Serialize defined default values
84+
assertEquals("{\"a\":0.0}", orNullHelper(g -> JsonpUtils.serializeDoubleOrNull(g, 0.0, 0.0)));
85+
86+
}
87+
88+
@Test
89+
public void testSerializeIntOrNull() {
90+
assertEquals("{\"a\":null}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, Integer.MAX_VALUE, Integer.MAX_VALUE)));
91+
assertEquals("{\"a\":1}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, 1, Integer.MAX_VALUE)));
92+
assertEquals("{\"a\":1}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, 1, 0)));
93+
94+
// Integer.MAX_VALUE is valid if not the default value
95+
assertEquals("{\"a\":2147483647}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, Integer.MAX_VALUE, 0)));
96+
assertEquals("{\"a\":2147483647}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, Integer.MAX_VALUE, Integer.MIN_VALUE)));
97+
98+
// Serialize non infinite default values
99+
assertEquals("{\"a\":0}", orNullHelper(g -> JsonpUtils.serializeIntOrNull(g, 0, 0)));
100+
}
101+
102+
private static String orNullHelper(Consumer<JsonGenerator> c) {
103+
StringWriter sw = new StringWriter();
104+
JsonGenerator generator = JsonpUtils.provider().createGenerator(sw);
105+
106+
generator.writeStartObject();
107+
generator.writeKey("a");
108+
c.accept(generator);
109+
generator.writeEnd();
110+
generator.close();
111+
112+
return sw.toString();
113+
}
63114
}

0 commit comments

Comments
 (0)