0%

fastjson2自定义注解

FASTJSON 2是一个性能极致并且简单易用的Java JSON库。

貌似中文互联网上还没有相关的教程。稍微看了下fastjson2的实现,相较于fastjson还是有很大改动的。

自定义注解,在处理定制化逻辑,例如:ID混淆、数据转换、RPC等场景时还是比较实用的。

下面就写一个简单的demo。

Java

自定义注解

实现一个自定义JSON字段名称的功能

1
2
3
4
5
6
7
8
9
/**
* @author yhzdys
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JSONField2 {

String value();
}

自定义 ObjectWriter

单独识别上面我们自定义的注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import com.alibaba.fastjson2.codec.BeanInfo;
import com.alibaba.fastjson2.codec.FieldInfo;
import com.alibaba.fastjson2.modules.ObjectWriterAnnotationProcessor;
import com.alibaba.fastjson2.util.BeanUtils;
import com.alibaba.fastjson2.writer.ObjectWriterBaseModule;
import com.alibaba.fastjson2.writer.ObjectWriterProvider;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* @author yhzdys
*/
final class JSONFieldWriter extends ObjectWriterBaseModule {

private final ObjectWriterAnnotationProcessor processor;

JSONFieldWriter(ObjectWriterProvider provider) {
super(provider);
final ObjectWriterAnnotationProcessor processor = super.getAnnotationProcessor();
this.processor = new ObjectWriterAnnotationProcessor() {

@Override
public void getBeanInfo(final BeanInfo beanInfo, final Class objectClass) {
processor.getBeanInfo(beanInfo, objectClass);
}

@Override
public void getFieldInfo(final BeanInfo beanInfo, final FieldInfo fieldInfo, final Class objectClass, final Field field) {
final JSONField2 annotation = field.getAnnotation(JSONField2.class);
if (annotation == null) {
processor.getFieldInfo(beanInfo, fieldInfo, objectClass, field);
} else {
fieldInfo.ignore = false;
fieldInfo.fieldClassMixIn = false;
fieldInfo.fieldName = annotation.value();
}
}

@Override
public void getFieldInfo(final BeanInfo beanInfo, final FieldInfo fieldInfo, final Class objectClass, final Method method) {
if (objectClass.getName().startsWith("java.lang") || BeanUtils.isRecord(objectClass)) {
processor.getFieldInfo(beanInfo, fieldInfo, objectClass, method);
return;
}
final Field field = BeanUtils.getField(objectClass, method);
if (field == null) {
processor.getFieldInfo(beanInfo, fieldInfo, objectClass, method);
return;
}
fieldInfo.features |= FieldInfo.FIELD_MASK;
this.getFieldInfo(beanInfo, fieldInfo, objectClass, field);
}
};
}

@Override
public ObjectWriterAnnotationProcessor getAnnotationProcessor() {
return this.processor;
}
}

自定义 ObjectReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.alibaba.fastjson2.codec.FieldInfo;
import com.alibaba.fastjson2.reader.ObjectReaderBaseModule;
import com.alibaba.fastjson2.reader.ObjectReaderProvider;

import java.lang.reflect.Field;

/**
* @author yhzdys
*/
final class JSONFieldReader extends ObjectReaderBaseModule {

JSONFieldReader(ObjectReaderProvider provider) {
super(provider);
}

@Override
public void getFieldInfo(final FieldInfo fieldInfo, final Class objectClass, final Field field) {
final JSONField2 annotation = field.getAnnotation(JSONField2.class);
if (annotation == null) {
super.getFieldInfo(fieldInfo, objectClass, field);
return;
}
fieldInfo.ignore = false;
fieldInfo.fieldClassMixIn = false;
fieldInfo.fieldName = annotation.value();
}
}

注册自定义的 ObjectWriter 和 ObjectReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import com.alibaba.fastjson2.JSONFactory;
import com.alibaba.fastjson2.reader.ObjectReaderProvider;
import com.alibaba.fastjson2.writer.ObjectWriterProvider;

public class Test {

static {
final ObjectReaderProvider readerProvider = JSONFactory.getDefaultObjectReaderProvider();
readerProvider.getModules().clear();
readerProvider.register(new JSONFieldReader(readerProvider));

final ObjectWriterProvider writerProvider = JSONFactory.getDefaultObjectWriterProvider();
writerProvider.getModules().clear();
writerProvider.register(new JSONFieldWriter(writerProvider));
}
}

完工

以上demo仅供参考。需根据实际情况调整。