fastjson使用-- @JSONField使用

@JSONField注解可以用在方法(method),属性(field)以及方法中的参数(parameter)上。JSONField中的name属性用来指定JSON串中key的名称。

@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。
public class Person {
    @JSONField(name = "name") // 注意观察生成的JSON串中name和age的区别
    private String name;
    @JSONField(name = "AGE")
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

@JSONField也可以直接作用在get或set方法上
@JSONField(name = "name")
public String getName() {
    return name;
}

@JSONField(name = "name")
public void setName(String name) {
    this.name = name;
}

@JSONField(name = "AGE")
public String getAge() {
    return age;
}

@JSONField(name = "AGE")
public void setAge(String age) {
    this.age = age;
}

PS:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。

public class PersonTest {
    private Person person;

    /**
    * 初始化对象
    */
    @Before
    public void setUp() {
        person = new Person();
        person.setName("gyl");
        person.setAge("20");
    }

    @Test
    public void test() {
        String jsonStr = JSONObject.toJSONString(person);
        System.out.println("bean to json:" + jsonStr);
        person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
        System.out.println("json to bean:" + person.getName());
    }
}

Output:
bean to json:{"AGE":"20","name":"gyl"}
json to bean:gyl

JSONField默认支持的类型

public @interface JSONField {
    int ordinal() default 0;

    String name() default "";

    String format() default "";

    boolean serialize() default true;

    boolean deserialize() default true;

    SerializerFeature[] serialzeFeatures() default {};

    Feature[] parseFeatures() default {};

    String label() default "";

    boolean jsonDirect() default false;

    Class<?> serializeUsing() default Void.class;

    Class<?> deserializeUsing() default Void.class;

    String[] alternateNames() default {};

    boolean unwrapped() default false;
}

format规定日期格式

@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;

ordinal规定字段的顺序

@JSONField(ordinal = 3)
private int f0;

@JSONField(ordinal = 2)
private int f1;

@JSONField(ordinal = 1)
private int f2;
fastjson序列化⼀个java bean,是根据fieldName的字母序进⾏序列的你可以通过ordinal指定字段的顺序。

serialize/deserialize指定字段不序列化

@JSONField(serialize=false)
public Date date;

@JSONField可以配置到字段和方法上,那不同的配置有什么不同呢?下面我们就来看看具体配置到不同的方法上。

我们在创建实体类的时候,都要求属性必须创建get和set方法,否则fastjson将不会进行识别,下面我们看看把@JSONField配置到具体的get和set方法上

/**
 * @Title: getDate 
 * @Description: 配置序列化的时候,日期序列化为startDate
 * @return Date
 */
@JSONField(name = "startDate")
public Date getDate() {
    return date;
}
    
/**
 * @Title: setDate 
 * @Description: 配置反序列化的时候,以endDate去匹配
 * @param date
 * @return void
 */
@JSONField(name = "endDate")
public void setDate(Date date) {
    this.date = date;
}
    
/**
 * @Title: getId 
 * @Description: 配置序列化的时候,不序列化id
 * @return int
 */
@JSONField(serialize = false)
public int getId() {
    return id;
}
    
/**
 * @Title: setId 
 * @Description: 配置反序列化的时候,不反序列化id
 * @return void
 */
@JSONField(deserialize = false)
public void setId(int id) {
    this.id = id;
}

具体的代码,就是上面的,挺简单的。下面来看看结果:

{"age":25,"name":"LiLei","sex":"男","startDate":1451985134688}
User [id=0, name=LiLei, age=25, sex=男, date=Tue Jan 05 17:04:47 CST 2016

我们看到id既没有序列化也没有反序列化,date字段序列化的时候变为了startDate

我们再来看看下面的代码看看结果跟上面做个比较:

// 反序列化
String jsonStr = "{\"id\":10,\"age\":25,\"name\":\"LiLei\",\"sex\":\"男\",\"startDate\":1451984687404}";
// @JSONField配置了,不反序列化id,date的匹配name为endDate
Uo2 uo = JSON.parseObject(jsonStr, Uo2.class);
System.out.println(uo.toString());

再来看看结果:

User [id=0, name=LiLei, age=25, sex=男, date=null]

这个时候我们看到没有识别到date,因为我们在date字段的set方法上配置了@JSONField(name = "endDate")所以其在识别的时候,是通过endDate去识别key的,而我们的json数据里根本没有endDate这个key,所以没法识别。

根据上面我们可以总结出一个结论:

1.序列化(JavaBean --> json)时配置到对应字段的get()方法上

2.反序列化(json --> JavaBean)时配置到对应字段的set()方法上

fastjson使用-- @JSONField使用fastjson使用-- @JSONField使用 beidaol 发布了46 篇原创文章 · 获赞 53 · 访问量 22万+ 私信 关注
上一篇:解决FastJSON反序列化顺序问题


下一篇:工具篇-Java中一些utils