Skip to content

Commit 1c41b4d

Browse files
authored
Merge pull request #323 from avaje/feature/simple-readerWriter
[json-core] Add helper toJson() fromJson() methods that use JsonReader JsonWriter
2 parents c30df3b + 32e5b07 commit 1c41b4d

File tree

6 files changed

+191
-1
lines changed

6 files changed

+191
-1
lines changed

json-core/src/main/java/io/avaje/json/simple/DSimpleMapper.java

+22
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.avaje.json.simple;
22

33
import io.avaje.json.JsonAdapter;
4+
import io.avaje.json.JsonReader;
5+
import io.avaje.json.JsonWriter;
46
import io.avaje.json.PropertyNames;
57
import io.avaje.json.core.CoreTypes;
68
import io.avaje.json.stream.JsonStream;
@@ -52,11 +54,26 @@ public String toJson(Object object) {
5254
return objectType.toJson(object);
5355
}
5456

57+
@Override
58+
public void toJson(Object object, JsonWriter jsonWriter) {
59+
objectType.toJson(object, jsonWriter);
60+
}
61+
5562
@Override
5663
public Object fromJson(String json) {
5764
return objectType.fromJson(json);
5865
}
5966

67+
@Override
68+
public Object fromJson(JsonReader jsonReader) {
69+
return objectType.fromJson(jsonReader);
70+
}
71+
72+
@Override
73+
public Map<String, Object> fromJsonObject(JsonReader jsonReader) {
74+
return mapType.fromJson(jsonReader);
75+
}
76+
6077
@Override
6178
public Map<String,Object> fromJsonObject(String json) {
6279
return mapType.fromJson(json);
@@ -66,4 +83,9 @@ public Map<String,Object> fromJsonObject(String json) {
6683
public List<Object> fromJsonArray(String json) {
6784
return listType.fromJson(json);
6885
}
86+
87+
@Override
88+
public List<Object> fromJsonArray(JsonReader jsonReader) {
89+
return listType.fromJson(jsonReader);
90+
}
6991
}

json-core/src/main/java/io/avaje/json/simple/SimpleMapper.java

+27
Original file line numberDiff line numberDiff line change
@@ -73,25 +73,52 @@ static Builder builder() {
7373
*/
7474
String toJson(Object object);
7575

76+
/**
77+
* Write the object to JsonWriter.
78+
* <p>
79+
* For options to write json content to OutputStream, Writer etc
80+
* use {@link Type}.
81+
*/
82+
void toJson(Object object, JsonWriter jsonWriter);
83+
7684
/**
7785
* Read the object from JSON string.
7886
*/
7987
Object fromJson(String json);
8088

89+
/**
90+
* Read the object from JSON.
91+
*/
92+
Object fromJson(JsonReader jsonReader);
93+
8194
/**
8295
* Read a Map from JSON OBJECT string.
8396
* <p>
8497
* Use {@link #map()} for more reading options.
8598
*/
8699
Map<String, Object> fromJsonObject(String json);
87100

101+
/**
102+
* Read a Map from JSON OBJECT.
103+
* <p>
104+
* Use {@link #map()} for more reading options.
105+
*/
106+
Map<String, Object> fromJsonObject(JsonReader jsonReader);
107+
88108
/**
89109
* Read a List from JSON ARRAY string.
90110
* <p>
91111
* Use {@link #list()} for more reading options.
92112
*/
93113
List<Object> fromJsonArray(String json);
94114

115+
/**
116+
* Read a List from JSON ARRAY.
117+
* <p>
118+
* Use {@link #list()} for more reading options.
119+
*/
120+
List<Object> fromJsonArray(JsonReader jsonReader);
121+
95122
/**
96123
* Return the property names as PropertyNames.
97124
* <p>

json-core/src/test/java/io/avaje/json/simple/SimpleMapperTest.java

+52-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.avaje.json.simple;
22

33

4+
import io.avaje.json.JsonReader;
5+
import io.avaje.json.stream.BufferedJsonWriter;
6+
import io.avaje.json.stream.JsonStream;
47
import org.junit.jupiter.api.Test;
58

69
import java.util.LinkedHashMap;
@@ -30,14 +33,52 @@ void mapToJsonFromJson() {
3033

3134
Map<String, Object> mapFromJson2 = simpleMapper.map().fromJson(asJson);
3235
assertThat(mapFromJson2).isEqualTo(mapFromJson);
36+
37+
JsonStream jsonStream = JsonStream.builder().build();
38+
try (JsonReader reader = jsonStream.reader(asJson)) {
39+
Map<String, Object> mapFromJson3 = simpleMapper.fromJsonObject(reader);
40+
assertThat(mapFromJson3).isEqualTo(mapFromJson);
41+
}
42+
}
43+
44+
@Test
45+
void toJsonWriter_scalar() {
46+
JsonStream jsonStream = JsonStream.builder().build();
47+
BufferedJsonWriter writer0 = jsonStream.bufferedWriter();
48+
simpleMapper.toJson("hi", writer0);
49+
assertThat(writer0.result()).isEqualTo("\"hi\"");
50+
}
51+
52+
@Test
53+
void toJsonWriter_map() {
54+
JsonStream jsonStream = JsonStream.builder().build();
55+
BufferedJsonWriter writer0 = jsonStream.bufferedWriter();
56+
simpleMapper.toJson(Map.of("key", 0), writer0);
57+
assertThat(writer0.result()).isEqualTo("{\"key\":0}");
58+
}
59+
60+
@Test
61+
void toJsonWriter_list() {
62+
JsonStream jsonStream = JsonStream.builder().build();
63+
BufferedJsonWriter writer0 = jsonStream.bufferedWriter();
64+
simpleMapper.toJson(List.of("a", 0), writer0);
65+
assertThat(writer0.result()).isEqualTo("[\"a\",0]");
3366
}
3467

3568
@Test
3669
void nullDirectly() {
37-
var mapFromJson = simpleMapper.fromJson("null");
70+
var mapFromJson = simpleMapper.fromJson("null");
3871
assertThat(mapFromJson).isNull();
3972
}
4073

74+
@Test
75+
void objectJsonReader() {
76+
try (var reader = JsonStream.builder().build().reader("\"hi\"")) {
77+
var fromJson = simpleMapper.fromJson(reader);
78+
assertThat(fromJson).isEqualTo("hi");
79+
}
80+
}
81+
4182
@Test
4283
void mapWithNull() {
4384
Map<String, Object> mapFromJson = simpleMapper.fromJsonObject("{\"one\":1,\"two\":null,\"three\":3}");
@@ -58,6 +99,16 @@ void listWithNull() {
5899
assertThat(simpleMapper.toJson(listFromJson)).isEqualTo("[1,3]");
59100
}
60101

102+
@Test
103+
void listWithReader() {
104+
try (JsonReader reader = JsonStream.builder().build().reader("[1,2]")) {
105+
List<Object> listFromJson = simpleMapper.fromJsonArray(reader);
106+
107+
assertThat(listFromJson).hasSize(2);
108+
assertThat(simpleMapper.toJson(listFromJson)).isEqualTo("[1,2]");
109+
}
110+
}
111+
61112
@Test
62113
void arrayToJsonFromJson() {
63114

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

+38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.avaje.json.node;
22

33
import io.avaje.json.JsonAdapter;
4+
import io.avaje.json.JsonReader;
5+
import io.avaje.json.JsonWriter;
46
import io.avaje.json.PropertyNames;
57
import io.avaje.json.node.adapter.NodeAdapterBuilder;
68
import io.avaje.json.simple.SimpleMapper;
@@ -87,6 +89,17 @@ static Builder builder() {
8789
*/
8890
String toJson(JsonNode node);
8991

92+
/**
93+
* Write the node to JSON.
94+
* <p>
95+
* For options to write json content to OutputStream, Writer etc
96+
* use {@link #nodeMapper()}.
97+
*
98+
* @see SimpleMapper.Type#toJson(Object, OutputStream)
99+
* @see SimpleMapper.Type#toJson(Object, Writer)
100+
*/
101+
void toJson(JsonNode node, JsonWriter jsonWriter);
102+
90103
/**
91104
* Read any json content returning a JsonNode.
92105
* <p>
@@ -104,6 +117,17 @@ static Builder builder() {
104117
*/
105118
JsonNode fromJson(String json);
106119

120+
/**
121+
* Read any json content returning a JsonNode.
122+
* <p>
123+
* For options to read json content from InputStream, Reader etc
124+
* use the fromJson methods on {@link SimpleMapper.Type}.
125+
*
126+
* @see SimpleMapper.Type#fromJson(Reader)
127+
* @see SimpleMapper.Type#fromJson(InputStream)
128+
*/
129+
JsonNode fromJson(JsonReader jsonReader);
130+
107131
/**
108132
* Read a JsonObject from json string content.
109133
* <p>
@@ -114,6 +138,13 @@ static Builder builder() {
114138
*/
115139
JsonObject fromJsonObject(String json);
116140

141+
/**
142+
* Read a JsonObject from json string content.
143+
* <p>
144+
* Use this when we know that the json content is a JsonObject.
145+
*/
146+
JsonObject fromJsonObject(JsonReader jsonReader);
147+
117148
/**
118149
* Read a JsonArray from json string content.
119150
* <p>
@@ -124,6 +155,13 @@ static Builder builder() {
124155
*/
125156
JsonArray fromJsonArray(String json);
126157

158+
/**
159+
* Read a JsonArray from json string content.
160+
* <p>
161+
* Use this when we know that the json content is a JsonArray.
162+
*/
163+
JsonArray fromJsonArray(JsonReader jsonReader);
164+
127165
/**
128166
* Helper method to read JSON with an expected JsonNode type.
129167
*

json-node/src/main/java/io/avaje/json/node/adapter/DJsonNodeMapper.java

+21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.avaje.json.JsonAdapter;
44
import io.avaje.json.JsonReader;
5+
import io.avaje.json.JsonWriter;
56
import io.avaje.json.PropertyNames;
67
import io.avaje.json.node.*;
78
import io.avaje.json.simple.SimpleMapper;
@@ -63,6 +64,11 @@ public String toJson(JsonNode node) {
6364
return writer.result();
6465
}
6566

67+
@Override
68+
public void toJson(JsonNode node, JsonWriter jsonWriter) {
69+
nodeAdapter.toJson(jsonWriter, node);
70+
}
71+
6672
@Override
6773
public JsonNode fromJson(String json) {
6874
try (JsonReader reader = jsonStream.reader(json)) {
@@ -84,6 +90,21 @@ public JsonArray fromJsonArray(String json) {
8490
}
8591
}
8692

93+
@Override
94+
public JsonNode fromJson(JsonReader jsonReader) {
95+
return nodeAdapter.fromJson(jsonReader);
96+
}
97+
98+
@Override
99+
public JsonObject fromJsonObject(JsonReader jsonReader) {
100+
return objectAdapter.fromJson(jsonReader);
101+
}
102+
103+
@Override
104+
public JsonArray fromJsonArray(JsonReader jsonReader) {
105+
return arrayAdapter.fromJson(jsonReader);
106+
}
107+
87108
@Override
88109
public <T extends JsonNode> T fromJson(Class<T> type, String json) {
89110
JsonAdapter<T> adapter = adapter(type);

json-node/src/test/java/io/avaje/json/node/adapter/JsonNodeAdaptersTest.java

+31
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.avaje.json.JsonReader;
55
import io.avaje.json.node.*;
66
import io.avaje.json.simple.SimpleMapper;
7+
import io.avaje.json.stream.BufferedJsonWriter;
78
import io.avaje.json.stream.JsonStream;
89
import org.junit.jupiter.api.Test;
910

@@ -102,6 +103,36 @@ void create_JsonString_expect_sameInstance() {
102103
assertThat(jsonAdapter).isSameAs(adapter);
103104
}
104105

106+
@Test
107+
void toJsonWriter() {
108+
BufferedJsonWriter writer = stream.bufferedWriter();
109+
mapper.toJson(JsonArray.create().add(1).add(2), writer);
110+
assertThat(writer.result()).isEqualTo("[1,2]");
111+
}
112+
113+
@Test
114+
void fromJson_usingReader() {
115+
try (var reader = stream.reader("[42, \"foo\"]")) {
116+
JsonNode node = mapper.fromJson(reader);
117+
assertThat(node).isEqualTo(JsonArray.create().add(42L).add("foo"));
118+
}
119+
}
120+
121+
@Test
122+
void fromJsonArray_usingReader() {
123+
try (var reader = stream.reader("[42, \"foo\"]")) {
124+
JsonArray node = mapper.fromJsonArray(reader);
125+
assertThat(node).isEqualTo(JsonArray.create().add(42L).add("foo"));
126+
}
127+
}
128+
129+
@Test
130+
void fromJsonObject_usingReader() {
131+
try (var reader = stream.reader("{\"a\":1,\"b\":2}")) {
132+
JsonObject node = mapper.fromJsonObject(reader);
133+
assertThat(node).isEqualTo(JsonObject.create().add("a", 1L).add("b", 2L));
134+
}
135+
}
105136

106137
@Test
107138
void arrayCreateOfMixed_defaultStream() {

0 commit comments

Comments
 (0)