概述
讲到@JSONField 注解,就不得不提到Alibaba 开源的fasejson
fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki
这里有jackson作者cowtowncoder等人对fastjson的性能评价:https://groups.google.com/forum/#!topic/java-serialization-benchmarking/8eS1KOquAhw
Fastjson VS gson性能
fastjson比gson快大约6倍,测试结果上这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results
下面我们来介绍@JSONField 注解的应用:
1. JSONField 介绍
注意:1.1、若属性是私有的,必须有set*方法。否则无法反序列化。
package com.alibaba.fastjson.annotation;
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才⽀持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对⽇期格式有⽤
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
2. JSONField配置方式
2.1FieldInfo可以配置在getter/setter⽅法或者字段上。例如:
public class A {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
2.2 配置在field上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
2.3 使⽤format配置⽇期格式化
public class A {
// 配置date序列化和反序列使⽤yyyyMMdd⽇期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
2.4 使⽤serialize/deserialize指定字段不序列化
public class A {
@JSONField(serialize=false)
public Date date;
}
2.5 使⽤ordinal指定字段的顺序
*注:缺省fastjson序列化⼀个java bean,是根据fieldName的字母序进⾏序列的你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。*
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
2.6 使⽤serializeUsing制定属性的序列化类
*在fastjson 1.2.16版本之后,JSONField⽀持新的定制化配置serializeUsing,可以单独对某⼀个类的某个属性定制序列化,⽐如:*
package com.fxbin123.bean;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import java.io.IOException;
import java.lang.reflect.Type;
/**
* @创建用户: fxb
* @创建时间: 2017年11月07日 10:00
* @描述: myself test demo
*/
public class MyTest {
public static class A {
@JSONField(serializeUsing = AValueSerializer.class)
public int value;
}
public static class AValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
Integer value = (Integer) object;
String text = value + "元";
serializer.write(text);
}
}
public static void main(String[] args) {
A obj = new A();
obj.value = 100;
String json = JSON.toJSONString(obj);
System.out.println(json);
}
}
运行结果打印输出
2.8 JSONField jsonDirect
在fastjson-1.2.12版本中,JSONField⽀持⼀个新的配置项jsonDirect,它的⽤是:当你有⼀个字段是字符串类型,⾥⾯是json格式数据,你希望直接输⼊,⽽不是经过转义之后再输出。
package com.fxbin123.bean;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import java.io.IOException;
import java.lang.reflect.Type;
/**
* @创建用户: fxb
* @创建时间: 2017年11月07日 10:00
* @描述: myself test demo
*/
public class MyTest {
public static void main(String[] args) {
// A obj = new A();
// obj.value = 100;
// String json = JSON.toJSONString(obj);
// System.out.println(json);
B b = new B();
b.id = 9999;
b.value = "{}";
String json = JSON.toJSONString(b);
System.out.println(json);
}
public static class B{
public int id;
@JSONField(jsonDirect = true)
public String value;
}
}
最后
以上就是唠叨星星为你收集整理的@JSONField 注解详解和应用的全部内容,希望文章能够帮你解决@JSONField 注解详解和应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复