Skip to content

Commit 5040092

Browse files
committed
json-iterator#56 recursive structure encoding
1 parent e440a11 commit 5040092

3 files changed

Lines changed: 34 additions & 2 deletions

File tree

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.jsoniter.output;
22

3+
import com.jsoniter.any.Any;
34
import com.jsoniter.spi.JsonException;
45
import com.jsoniter.spi.Encoder;
56
import com.jsoniter.spi.Extension;
@@ -74,7 +75,7 @@ public static Encoder getEncoder(String cacheKey, Type type) {
7475
return gen(cacheKey, type);
7576
}
7677

77-
private static synchronized Encoder gen(String cacheKey, Type type) {
78+
private static synchronized Encoder gen(final String cacheKey, Type type) {
7879
Encoder encoder = JsoniterSpi.getEncoder(cacheKey);
7980
if (encoder != null) {
8081
return encoder;
@@ -117,6 +118,7 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
117118
}
118119
}
119120
}
121+
addPlaceholderEncoderToSupportRecursiveStructure(cacheKey);
120122
clazz = chooseAccessibleSuper(clazz);
121123
CodegenResult source = genSource(cacheKey, clazz, typeArgs);
122124
try {
@@ -135,6 +137,20 @@ private static synchronized Encoder gen(String cacheKey, Type type) {
135137
}
136138
}
137139

140+
private static void addPlaceholderEncoderToSupportRecursiveStructure(final String cacheKey) {
141+
JsoniterSpi.addNewEncoder(cacheKey, new Encoder() {
142+
@Override
143+
public void encode(Object obj, JsonStream stream) throws IOException {
144+
JsoniterSpi.getEncoder(cacheKey).encode(obj, stream);
145+
}
146+
147+
@Override
148+
public Any wrap(Object obj) {
149+
return JsoniterSpi.getEncoder(cacheKey).wrap(obj);
150+
}
151+
});
152+
}
153+
138154
private static Class chooseAccessibleSuper(Class clazz) {
139155
if (Modifier.isPublic(clazz.getModifiers())) {
140156
return clazz;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.jsoniter.output;
22

3-
import com.jsoniter.spi.JsonException;
43
import com.jsoniter.any.Any;
54
import com.jsoniter.spi.Encoder;
5+
import com.jsoniter.spi.JsonException;
66
import com.jsoniter.spi.TypeLiteral;
77

88
import java.io.IOException;

src/test/java/com/jsoniter/output/TestNested.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jsoniter.output;
22

3+
import com.jsoniter.annotation.JsonProperty;
4+
import com.jsoniter.annotation.JsoniterAnnotationSupport;
35
import com.jsoniter.spi.TypeLiteral;
46
import junit.framework.TestCase;
57

@@ -86,4 +88,18 @@ public void test_map_of_objects() throws IOException {
8688
" }\n" +
8789
"}".replace('\'', '"'), baos.toString());
8890
}
91+
92+
public static class TestObject3 {
93+
@JsonProperty(omitNull = false)
94+
public TestObject3 reference;
95+
}
96+
97+
public void test_recursive_class() {
98+
// recursive reference will not be supported
99+
// however recursive structure is supported
100+
JsoniterAnnotationSupport.enable();
101+
TestObject3 obj = new TestObject3();
102+
JsonStream.setMode(EncodingMode.DYNAMIC_MODE);
103+
assertEquals("{\"reference\":null}", JsonStream.serialize(obj));
104+
}
89105
}

0 commit comments

Comments
 (0)