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

[json-node] Add JsonNode.toPlain() method to return as plain java types #313

Merged
merged 1 commit into from
Dec 12, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonArray.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@ public JsonArray copy() {
return new JsonArray(newList);
}

@Override
public List<Object> toPlain() {
final var newList = new ArrayList<>(children.size());
for (JsonNode child : children) {
newList.add(child.toPlain());
}
return newList;
}

@Override
public Type type() {
return Type.ARRAY;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonBoolean.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public JsonBoolean copy() {
return this;
}

@Override
public Boolean toPlain() {
return value;
}

@Override
public Type type() {
return Type.BOOLEAN;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonDecimal.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public JsonDecimal copy() {
return this;
}

@Override
public BigDecimal toPlain() {
return value;
}

@Override
public Type type() {
return Type.NUMBER;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonDouble.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public JsonDouble copy() {
return this;
}

@Override
public Double toPlain() {
return value;
}

@Override
public Type type() {
return Type.NUMBER;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonInteger.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public JsonInteger copy() {
return this;
}

@Override
public Integer toPlain() {
return value;
}

@Override
public Type type() {
return Type.NUMBER;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonLong.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public JsonLong copy() {
return this;
}

@Override
public Long toPlain() {
return value;
}

@Override
public Type type() {
return Type.NUMBER;
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ public boolean isObject() {
*/
JsonNode copy();

/**
* Return the JsonNode as its plain Java value ({@code String, Integer, List, Map etc}).
*/
Object toPlain();

/**
* Find a node given a path using dot notation.
*
Expand Down
9 changes: 9 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,15 @@ public JsonObject copy() {
return new JsonObject(mapCopy);
}

@Override
public Map<String, Object> toPlain() {
final var mapCopy = new LinkedHashMap<String, Object>();
for (Map.Entry<String, JsonNode> entry : children.entrySet()) {
mapCopy.put(entry.getKey(), entry.getValue().toPlain());
}
return mapCopy;
}

/**
* Return true if the json object contains no elements.
*/
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/main/java/io/avaje/json/node/JsonString.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public JsonString copy() {
return this;
}

@Override
public String toPlain() {
return value;
}

@Override
public Type type() {
return Type.STRING;
Expand Down
13 changes: 13 additions & 0 deletions json-node/src/test/java/io/avaje/json/node/JsonArrayTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -132,4 +133,16 @@ void unmodifiable() {
.isInstanceOf(UnsupportedOperationException.class);
}

@Test
void toPlain() {
final JsonArray source = JsonArray.create()
.add("foo")
.add(JsonObject.create().add("b", 42));

List<Object> plain = source.toPlain();
assertThat(plain).hasSize(2);
assertThat(plain.get(0)).isEqualTo("foo");
assertThat(plain.get(1)).isEqualTo(Map.of("b", 42));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ void copy() {
assertThat(jsonBoolean.copy()).isSameAs(jsonBoolean);
}

@Test
void toPlain() {
assertThat(jsonBoolean.toPlain()).isTrue();
assertThat(JsonBoolean.of(false).toPlain()).isFalse();
}

@Test
void unmodifiable() {
assertThat(jsonBoolean.unmodifiable()).isSameAs(jsonBoolean);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ void unmodifiable() {
assertThat(jsonDecimal.unmodifiable()).isSameAs(jsonDecimal);
}

@Test
void toPlain() {
assertThat(jsonDecimal.toPlain()).isEqualTo(new BigDecimal("42.3"));
}

@Test
void value() {
assertThat(jsonDecimal.doubleValue()).isEqualTo(42.3D);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ void unmodifiable() {
assertThat(jsonDouble.unmodifiable()).isSameAs(jsonDouble);
}

@Test
void toPlain() {
assertThat(jsonDouble.toPlain()).isEqualTo(42.3D);
}

@Test
void value() {
assertThat(jsonDouble.intValue()).isEqualTo(42);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ void unmodifiable() {
assertThat(jsonInteger.unmodifiable()).isSameAs(jsonInteger);
}

@Test
void toPlain() {
assertThat(jsonInteger.toPlain()).isEqualTo(42);
}

@Test
void value() {
assertThat(jsonInteger.intValue()).isEqualTo(42);
Expand Down
5 changes: 5 additions & 0 deletions json-node/src/test/java/io/avaje/json/node/JsonLongTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ void unmodifiable() {
assertThat(jsonLong.unmodifiable()).isSameAs(jsonLong);
}

@Test
void toPlain() {
assertThat(jsonLong.toPlain()).isEqualTo(42L);
}

@Test
void value() {
assertThat(jsonLong.intValue()).isEqualTo(42);
Expand Down
12 changes: 12 additions & 0 deletions json-node/src/test/java/io/avaje/json/node/JsonObjectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,4 +164,16 @@ void unmodifiable() {
assertThatThrownBy(() -> copy.add("canMutate", true))
.isInstanceOf(UnsupportedOperationException.class);
}

@Test
void toPlain() {
final var source = JsonObject.create()
.add("name", "foo")
.add("other", JsonObject.create().add("b", 42));

Map<String, Object> plainMap = source.toPlain();
assertThat(plainMap).containsOnlyKeys("name", "other");
assertThat(plainMap.get("name")).isEqualTo("foo");
assertThat(plainMap.get("other")).isEqualTo(Map.of("b", 42));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ void unmodifiable() {
assertThat(jsonString.unmodifiable()).isSameAs(jsonString);
}

@Test
void toPlain() {
assertThat(jsonString.toPlain()).isEqualTo("foo");
}

@Test
void value() {
assertThat(jsonString.value()).isEqualTo("foo");
Expand Down
Loading