Skip to content

Commit 168eabd

Browse files
committed
make lazy any serilize modified items
1 parent 9ee732d commit 168eabd

5 files changed

Lines changed: 51 additions & 6 deletions

File tree

src/main/java/com/jsoniter/any/Any.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public Any wrap(Object obj) {
2525
return (Any) obj;
2626
}
2727
};
28+
JsonStream.registerNativeEncoder(Any.class, anyEncoder);
2829
JsonStream.registerNativeEncoder(TrueAny.class, anyEncoder);
2930
JsonStream.registerNativeEncoder(FalseAny.class, anyEncoder);
3031
JsonStream.registerNativeEncoder(ArrayLazyAny.class, anyEncoder);

src/main/java/com/jsoniter/any/ArrayLazyAny.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package com.jsoniter.any;
22

33
import com.jsoniter.*;
4+
import com.jsoniter.output.JsonStream;
45
import com.jsoniter.spi.JsonException;
6+
import com.jsoniter.spi.TypeLiteral;
57

68
import java.io.IOException;
79
import java.util.ArrayList;
810
import java.util.Iterator;
911
import java.util.List;
12+
import java.util.Map;
1013

1114
class ArrayLazyAny extends LazyAny {
1215

16+
private final static TypeLiteral<List<Any>> typeLiteral = new TypeLiteral<List<Any>>(){};
1317
private List<Any> cache;
1418
private int lastParsedPos;
1519

@@ -214,4 +218,15 @@ private Any next_() throws IOException {
214218
return element;
215219
}
216220
}
221+
222+
@Override
223+
public void writeTo(JsonStream stream) throws IOException {
224+
if (lastParsedPos == head) {
225+
super.writeTo(stream);
226+
} else {
227+
// there might be modification
228+
fillCache();
229+
stream.writeVal(typeLiteral, cache);
230+
}
231+
}
217232
}

src/main/java/com/jsoniter/any/ObjectLazyAny.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.jsoniter.any;
22

33
import com.jsoniter.*;
4+
import com.jsoniter.output.JsonStream;
45
import com.jsoniter.spi.JsonException;
6+
import com.jsoniter.spi.TypeLiteral;
57

68
import java.io.IOException;
79
import java.util.HashMap;
@@ -11,6 +13,7 @@
1113

1214
class ObjectLazyAny extends LazyAny {
1315

16+
private final static TypeLiteral<Map<String, Any>> typeLiteral = new TypeLiteral<Map<String, Any>>(){};
1417
private Map<Object, Any> cache;
1518
private int lastParsedPos;
1619

@@ -134,14 +137,16 @@ private void fillCache() {
134137
try {
135138
JsonIterator iter = JsonIterator.tlsIter.get();
136139
iter.reset(data, lastParsedPos, tail);
137-
if (!CodegenAccess.readObjectStart(iter)) {
138-
lastParsedPos = tail;
139-
return;
140+
if (lastParsedPos == head) {
141+
if (!CodegenAccess.readObjectStart(iter)) {
142+
lastParsedPos = tail;
143+
return;
144+
}
145+
String field = CodegenAccess.readObjectFieldAsString(iter);
146+
cache.put(field, iter.readAny());
140147
}
141-
String field = CodegenAccess.readObjectFieldAsString(iter);
142-
cache.put(field, iter.readAny());
143148
while (CodegenAccess.nextToken(iter) == ',') {
144-
field = CodegenAccess.readObjectFieldAsString(iter);
149+
String field = CodegenAccess.readObjectFieldAsString(iter);
145150
cache.put(field, iter.readAny());
146151
}
147152
lastParsedPos = tail;
@@ -223,4 +228,15 @@ public Any value() {
223228
return value;
224229
}
225230
}
231+
232+
@Override
233+
public void writeTo(JsonStream stream) throws IOException {
234+
if (lastParsedPos == head) {
235+
super.writeTo(stream);
236+
} else {
237+
// there might be modification
238+
fillCache();
239+
stream.writeVal(typeLiteral, (Map) cache);
240+
}
241+
}
226242
}

src/main/java/com/jsoniter/output/CodegenResult.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ class CodegenResult {
88
private StringBuilder buffered = new StringBuilder();
99

1010
public static String bufferToWriteOp(String buffered) {
11+
if (buffered == null) {
12+
return "";
13+
}
1114
if (buffered.length() == 1) {
1215
return String.format("stream.write('%s');", escape(buffered.charAt(0)));
1316
} else if (buffered.length() == 2) {

src/test/java/com/jsoniter/TestDemo.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.jsoniter.any.Any;
55
import com.jsoniter.fuzzy.MaybeEmptyArrayDecoder;
66
import com.jsoniter.fuzzy.MaybeStringLongDecoder;
7+
import com.jsoniter.output.EncodingMode;
8+
import com.jsoniter.output.JsonStream;
79
import com.jsoniter.spi.Decoder;
810
import com.jsoniter.spi.EmptyExtension;
911
import com.jsoniter.spi.JsoniterSpi;
@@ -13,6 +15,7 @@
1315
import java.io.IOException;
1416
import java.lang.reflect.Type;
1517
import java.util.Date;
18+
import java.util.List;
1619

1720
public class TestDemo extends TestCase {
1821
public void test_bind_api() throws IOException {
@@ -120,4 +123,11 @@ public void test_iterator() throws IOException {
120123
assertFalse(iter.readArray()); // end outer array
121124
assertNull(iter.readObject()); // end object
122125
}
126+
127+
public void test_lazy() throws IOException {
128+
JsonStream.setMode(EncodingMode.DYNAMIC_MODE);
129+
Any any = JsonIterator.deserialize("{'numbers': ['1', '2', ['3', '4']]}".replace('\'', '"'));
130+
any.get("numbers").asList().add(Any.wrap("hello"));
131+
assertEquals("{'numbers':['1', '2', ['3', '4'],'hello']}".replace('\'', '"'), JsonStream.serialize(any));
132+
}
123133
}

0 commit comments

Comments
 (0)