Skip to content

Commit 4d92dc7

Browse files
authored
[json-node] Add extract() method for double type (was missing) (#324)
1 parent 1c41b4d commit 4d92dc7

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

json-node/src/main/java/io/avaje/json/node/JsonNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,15 @@ default long extract(String path, long missingValue) {
142142
throw new UnsupportedOperationException();
143143
}
144144

145+
/**
146+
* Extract the long from the given path if present or the given default value.
147+
*
148+
* @param missingValue The value to use when the path is missing.
149+
*/
150+
default double extract(String path, double missingValue) {
151+
throw new UnsupportedOperationException();
152+
}
153+
145154
/**
146155
* Extract the int from the given path if present or the given default value.
147156
*

json-node/src/main/java/io/avaje/json/node/JsonObject.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,14 @@ public long extract(String path, long missingValue) {
245245
: ((JsonNumber) node).longValue();
246246
}
247247

248+
@Override
249+
public double extract(String path, double missingValue) {
250+
final var node = find(path);
251+
return !(node instanceof JsonNumber)
252+
? missingValue
253+
: ((JsonNumber) node).doubleValue();
254+
}
255+
248256
@Override
249257
public Number extract(String path, Number missingValue) {
250258
final var node = find(path);

json-node/src/test/java/io/avaje/json/node/JsonObjectTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,39 @@ void nullValuesInMap() {
202202

203203
assertThat(jsonObject.elements().keySet()).containsExactly("a", "b", "c", "d");
204204
}
205+
206+
@Test
207+
void extractNumbers() {
208+
String s = "{\"aInt\":7,\"aDouble\":23.5,\"text\":\"foo\",\"bool\":true,\"aNull\":null}";
209+
JsonNodeMapper mapper = JsonNodeMapper.builder().build();
210+
JsonObject jsonObject = mapper.fromJsonObject(s);
211+
212+
// Number becomes a Long if it can or otherwise a Double
213+
assertThat(jsonObject.extract("aInt", BigDecimal.TEN)).isEqualTo(7L);
214+
assertThat(jsonObject.extract("aDouble", BigDecimal.TEN)).isEqualTo(23.5D);
215+
216+
assertThat(jsonObject.extract("aInt", 0)).isEqualTo(7);
217+
assertThat(jsonObject.extract("aInt", 0L)).isEqualTo(7L);
218+
assertThat(jsonObject.extract("aInt", 0D)).isEqualTo(7D);
219+
220+
assertThat(jsonObject.extract("aDouble", 0)).isEqualTo(23);
221+
assertThat(jsonObject.extract("aDouble", 0L)).isEqualTo(23L);
222+
assertThat(jsonObject.extract("aDouble", 0D)).isEqualTo(23.5D);
223+
224+
assertThat(jsonObject.extract("doesNotExist", 3)).isEqualTo(3);
225+
assertThat(jsonObject.extract("doesNotExist", 3L)).isEqualTo(3L);
226+
assertThat(jsonObject.extract("doesNotExist", 3.5D)).isEqualTo(3.5D);
227+
228+
assertThat(jsonObject.extract("text", 3)).isEqualTo(3);
229+
assertThat(jsonObject.extract("text", 3L)).isEqualTo(3L);
230+
assertThat(jsonObject.extract("text", 3.5D)).isEqualTo(3.5D);
231+
232+
assertThat(jsonObject.extract("bool", 3)).isEqualTo(3);
233+
assertThat(jsonObject.extract("bool", 3L)).isEqualTo(3L);
234+
assertThat(jsonObject.extract("bool", 3.5D)).isEqualTo(3.5D);
235+
236+
assertThat(jsonObject.extract("aNull", 3)).isEqualTo(3);
237+
assertThat(jsonObject.extract("aNull", 3L)).isEqualTo(3L);
238+
assertThat(jsonObject.extract("aNull", 3.5D)).isEqualTo(3.5D);
239+
}
205240
}

0 commit comments

Comments
 (0)