Skip to content

Commit 11198ae

Browse files
committed
demonstrate simple annotation support
1 parent a9444da commit 11198ae

File tree

8 files changed

+103
-3
lines changed

8 files changed

+103
-3
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<version>0.9.1</version>
88
<artifactId>jsoniter</artifactId>
99
<name>json iterator</name>
10-
<description>json iterator is fast and easy to use json parser</description>
10+
<description>jsoniter (json-iterator) is fast and flexible JSON parser available in Java and Go</description>
1111
<url>http://jsoniter.com</url>
1212
<packaging>jar</packaging>
1313

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,12 @@ private static void addFieldDispatch(StringBuilder lines, int len, int i, Map<By
248248
private static void genField(StringBuilder lines, Field field, String cacheKey) {
249249
String fieldTypeName = field.getType().getCanonicalName();
250250
String fieldCacheKey = field.getName() + "@" + cacheKey;
251-
if (cache.containsKey(fieldCacheKey)) {
251+
Decoder decoder = cache.get(fieldCacheKey);
252+
boolean useCustomizedDecoder = decoder != null;
253+
if (useCustomizedDecoder && decoder instanceof FieldDecoder) {
254+
useCustomizedDecoder = ((FieldDecoder) decoder).useDefaultDecoder();
255+
}
256+
if (useCustomizedDecoder) {
252257
append(lines, String.format("obj.%s = (%s)iter.read(\"%s\", %s.class);",
253258
field.getName(), fieldTypeName, fieldCacheKey, fieldTypeName));
254259
return;

src/main/java/com/jsoniter/FieldDecoder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,11 @@ public interface FieldDecoder extends Decoder {
66
*
77
* @return null, if field is the field name
88
*/
9-
public String[] getAlternativeFieldNames();
9+
String[] getAlternativeFieldNames();
10+
11+
/**
12+
* do not override decode
13+
* @return true, for default decoder
14+
*/
15+
boolean useDefaultDecoder();
1016
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.jsoniter.annotation.jsoniter;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface JsonProperty {
11+
String USE_DEFAULT_NAME = "";
12+
String value() default USE_DEFAULT_NAME;
13+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.jsoniter.annotation.jsoniter;
2+
3+
import com.jsoniter.*;
4+
5+
import java.io.IOException;
6+
import java.lang.reflect.Field;
7+
import java.lang.reflect.Type;
8+
9+
public class JsoniterAnnotationSupport implements FieldDecoderFactory {
10+
11+
public static void enable() {
12+
Jsoniter.registerFieldDecoderFactory(new JsoniterAnnotationSupport());
13+
}
14+
15+
@Override
16+
public Decoder createDecoder(final Field field) {
17+
JsonProperty annotation = field.getAnnotation(JsonProperty.class);
18+
if (annotation == null) {
19+
return null;
20+
}
21+
String alternativeField = annotation.value();
22+
if (alternativeField.equals(JsonProperty.USE_DEFAULT_NAME)) {
23+
alternativeField = field.getName();
24+
}
25+
final String[] alternativeFields = new String[]{alternativeField};
26+
final String fieldCacheKey = TypeLiteral.generateCacheKey(field.getGenericType());
27+
final Class<?> fieldType = field.getType();
28+
return new FieldDecoder() {
29+
@Override
30+
public String[] getAlternativeFieldNames() {
31+
return alternativeFields;
32+
}
33+
34+
@Override
35+
public boolean useDefaultDecoder() {
36+
return false;
37+
}
38+
39+
@Override
40+
public Object decode(Type type, Jsoniter iter) throws IOException {
41+
return iter.read(fieldCacheKey, fieldType);
42+
}
43+
};
44+
}
45+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.jsoniter;
2+
3+
import com.jsoniter.annotation.jsoniter.JsonProperty;
4+
5+
public class AnnotatedObject {
6+
@JsonProperty("field-1")
7+
public int field1;
8+
9+
@JsonProperty("field-2")
10+
public int field2;
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.jsoniter;
2+
3+
import com.jsoniter.annotation.jsoniter.JsoniterAnnotationSupport;
4+
import junit.framework.TestCase;
5+
6+
import java.io.IOException;
7+
8+
public class TestAnnotation extends TestCase {
9+
public void test() throws IOException {
10+
JsoniterAnnotationSupport.enable();
11+
Jsoniter iter = Jsoniter.parse("{'field-1': 100}".replace('\'', '"'));
12+
AnnotatedObject obj = iter.read(AnnotatedObject.class);
13+
assertEquals(100, obj.field1);
14+
}
15+
}

src/test/java/com/jsoniter/TestCustomize.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ public String[] getAlternativeFieldNames() {
6666
return new String[]{"field_1", "Field1"};
6767
}
6868

69+
@Override
70+
public boolean useDefaultDecoder() {
71+
return false;
72+
}
73+
6974
@Override
7075
public Object decode(Type type, Jsoniter iter) throws IOException {
7176
return Integer.toString(iter.readInt());

0 commit comments

Comments
 (0)