Skip to content

Commit 4d432bd

Browse files
committed
support TypeEncoder
1 parent 0099f09 commit 4d432bd

6 files changed

Lines changed: 103 additions & 79 deletions

File tree

src/main/java/com/jsoniter/spi/JsoniterSpi.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,12 @@ public static void registerTypeDecoder(TypeLiteral typeLiteral, Decoder decoder)
122122

123123
public static void registerTypeEncoder(Class clazz, Encoder encoder) {
124124
globalTypeEncoders.put(clazz, encoder);
125+
copyGlobalTypeEncoder(getCurrentConfig().configName(), clazz, encoder);
125126
}
126127

127128
public static void registerTypeEncoder(TypeLiteral typeLiteral, Encoder encoder) {
128129
globalTypeEncoders.put(typeLiteral.getType(), encoder);
130+
copyGlobalTypeEncoder(getCurrentConfig().configName(), typeLiteral.getType(), encoder);
129131
}
130132

131133
public static void registerPropertyDecoder(Class clazz, String field, Decoder decoder) {
@@ -156,6 +158,13 @@ private static void copyGlobalSettings(String configName) {
156158
for (Map.Entry<Type, Decoder> entry : globalTypeDecoders.entrySet()) {
157159
copyGlobalTypeDecoder(configName, entry.getKey(), entry.getValue());
158160
}
161+
for (Map.Entry<Type, Encoder> entry : globalTypeEncoders.entrySet()) {
162+
copyGlobalTypeEncoder(configName, entry.getKey(), entry.getValue());
163+
}
164+
}
165+
166+
private static void copyGlobalTypeEncoder(String configName, Type type, Encoder typeEncoder) {
167+
addNewEncoder(TypeLiteral.create(type).getEncoderCacheKey(configName), typeEncoder);
159168
}
160169

161170
private static void copyGlobalTypeDecoder(String configName, Type type, Decoder typeDecoder) {

src/test/java/com/jsoniter/TestCustomizeType.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,45 +11,11 @@
1111

1212
public class TestCustomizeType extends TestCase {
1313

14-
public static class MyDate {
15-
Date date;
16-
}
17-
1814
static {
19-
JsoniterSpi.registerTypeDecoder(MyDate.class, new Decoder() {
20-
@Override
21-
public Object decode(final JsonIterator iter) throws IOException {
22-
return new MyDate() {{
23-
date = new Date(iter.readLong());
24-
}};
25-
}
26-
});
2715
// JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_STRICTLY);
2816
// JsonIterator.setMode(DecodingMode.REFLECTION_MODE);
2917
}
3018

31-
public void test_direct() throws IOException {
32-
JsonIterator iter = JsonIterator.parse("1481365190000");
33-
MyDate date = iter.read(MyDate.class);
34-
assertEquals(1481365190000L, date.date.getTime());
35-
}
36-
37-
public static class FieldWithMyDate {
38-
public MyDate field;
39-
}
40-
41-
public void test_as_field_type() throws IOException {
42-
JsonIterator iter = JsonIterator.parse("{'field': 1481365190000}".replace('\'', '"'));
43-
FieldWithMyDate obj = iter.read(FieldWithMyDate.class);
44-
assertEquals(1481365190000L, obj.field.date.getTime());
45-
}
46-
47-
public void test_as_array_element() throws IOException {
48-
JsonIterator iter = JsonIterator.parse("[1481365190000]");
49-
MyDate[] dates = iter.read(MyDate[].class);
50-
assertEquals(1481365190000L, dates[0].date.getTime());
51-
}
52-
5319
public static class MyDate2 {
5420
Date date;
5521
}

src/test/java/com/jsoniter/TestSpiTypeDecoder.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.io.IOException;
99
import java.util.Arrays;
10+
import java.util.Date;
1011
import java.util.List;
1112

1213
public class TestSpiTypeDecoder extends TestCase {
@@ -49,4 +50,41 @@ public Object decode(JsonIterator iter) throws IOException {
4950
"{'field1': 100}".replace('\'', '"'), typeLiteral);
5051
assertEquals(101, objs.get(0).field1);
5152
}
53+
54+
public static class MyDate {
55+
Date date;
56+
}
57+
58+
static {
59+
JsoniterSpi.registerTypeDecoder(MyDate.class, new Decoder() {
60+
@Override
61+
public Object decode(final JsonIterator iter) throws IOException {
62+
return new MyDate() {{
63+
date = new Date(iter.readLong());
64+
}};
65+
}
66+
});
67+
}
68+
69+
public void test_direct() throws IOException {
70+
JsonIterator iter = JsonIterator.parse("1481365190000");
71+
MyDate date = iter.read(MyDate.class);
72+
assertEquals(1481365190000L, date.date.getTime());
73+
}
74+
75+
public static class FieldWithMyDate {
76+
public MyDate field;
77+
}
78+
79+
public void test_as_field_type() throws IOException {
80+
JsonIterator iter = JsonIterator.parse("{'field': 1481365190000}".replace('\'', '"'));
81+
FieldWithMyDate obj = iter.read(FieldWithMyDate.class);
82+
assertEquals(1481365190000L, obj.field.date.getTime());
83+
}
84+
85+
public void test_as_array_element() throws IOException {
86+
JsonIterator iter = JsonIterator.parse("[1481365190000]");
87+
MyDate[] dates = iter.read(MyDate[].class);
88+
assertEquals(1481365190000L, dates[0].date.getTime());
89+
}
5290
}

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

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.jsoniter.output;
2+
3+
import com.jsoniter.spi.EmptyEncoder;
4+
import com.jsoniter.spi.JsoniterSpi;
5+
import com.jsoniter.spi.TypeLiteral;
6+
import junit.framework.TestCase;
7+
8+
import java.io.IOException;
9+
import java.util.Arrays;
10+
import java.util.Date;
11+
import java.util.List;
12+
13+
public class TestSpiTypeEncoder extends TestCase {
14+
15+
public static class MyDate {
16+
Date date;
17+
}
18+
19+
public void test_TypeDecoder() throws IOException {
20+
JsoniterSpi.registerTypeEncoder(MyDate.class, new EmptyEncoder() {
21+
@Override
22+
public void encode(Object obj, JsonStream stream) throws IOException {
23+
MyDate date = (MyDate) obj;
24+
stream.writeVal(date.date.getTime());
25+
}
26+
});
27+
MyDate myDate = new MyDate();
28+
myDate.date = new Date(1481365190000L);
29+
String output = JsonStream.serialize(myDate);
30+
assertEquals("1481365190000", output);
31+
}
32+
33+
public void test_TypeDecoder_for_type_literal() {
34+
TypeLiteral<List<MyDate>> typeLiteral = new TypeLiteral<List<MyDate>>() {
35+
};
36+
JsoniterSpi.registerTypeEncoder(typeLiteral, new EmptyEncoder() {
37+
@Override
38+
public void encode(Object obj, JsonStream stream) throws IOException {
39+
List<MyDate> dates = (List<MyDate>) obj;
40+
stream.writeVal(dates.get(0).date.getTime());
41+
}
42+
});
43+
MyDate myDate = new MyDate();
44+
myDate.date = new Date(1481365190000L);
45+
String output = JsonStream.serialize(typeLiteral, Arrays.asList(myDate));
46+
assertEquals("1481365190000", output);
47+
}
48+
}

src/test/java/com/jsoniter/suite/AllTestCases.java

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

33
import com.jsoniter.*;
4+
import com.jsoniter.TestGenerics;
5+
import com.jsoniter.TestNested;
6+
import com.jsoniter.TestObject;
47
import com.jsoniter.any.TestList;
5-
import com.jsoniter.output.TestAnnotationJsonUnwrapper;
6-
import com.jsoniter.output.TestAny;
7-
import com.jsoniter.output.TestCustomizeField;
8-
import com.jsoniter.output.TestNative;
8+
import com.jsoniter.output.*;
99
import org.junit.runner.RunWith;
1010
import org.junit.runners.Suite;
1111

@@ -27,12 +27,14 @@
2727
com.jsoniter.output.TestArray.class,
2828
com.jsoniter.any.TestArray.class,
2929
com.jsoniter.TestArray.class,
30-
TestCustomizeField.class, com.jsoniter.output.TestCustomizeType.class,
30+
TestCustomizeField.class,
3131
com.jsoniter.TestMap.class,
3232
com.jsoniter.output.TestMap.class,
3333
TestNative.class, TestNested.class, TestObject.class, TestBoolean.class, TestFloat.class,
3434
TestList.class,
3535
com.jsoniter.output.TestJackson.class,
36-
com.jsoniter.TestJackson.class})
36+
com.jsoniter.TestJackson.class,
37+
TestSpiTypeEncoder.class,
38+
TestSpiTypeDecoder.class})
3739
public abstract class AllTestCases {
3840
}

0 commit comments

Comments
 (0)