大家好,又见面了,我是你们的朋友全栈君。
查看@JSONField注解的源码可以了解到它的作用范围是在方法(METHOD)、属性(FIELD)、方法中的参数(PARAMETER)上。
注意:1、若属性是私有的,必须有set*方法。否则无法反序列化。
package com.zhujie;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
public class User {
@JSONField(name="new_username")
private String username;
@JSONField(name="new_password")
private String password;
...
@Override
public String toString() {
// TODO Auto-generated method stub
return JSONObject.toJSONString(this);
}
public static void main(String[] args) {
User user = new User();
user.setUsername("lili");
user.setPassword("123456");
String jsonStr = JSONObject.toJSONString(user);
System.out.println("bean to json:"+jsonStr);
User user1 = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), User.class);
System.out.println("json to bean:"+user1.toString());
}
}
输出结果是:
bean to json:{
"new_password":"123456","new_username":"lili"}
json to bean:{
"new_password":"123456","new_username":"lili"}
通过上面的例子可以看出@JSONField注解可以改变序列化和反序列化字段的名称。
@JSONField(name="new_username")
public String getUsername() {
return username;
}
@JSONField(name="new_username")
public void setUsername(String username) {
this.username = username;
}
注解作用在方法之上序列化和反序列化生成的对象的字段名称都是new_username,可以改变字段的名称,跟上面直接注解到属性上是一样的效果。
翻看源码可以看到serialize、deserialize的默认值都是true,也就是说默认情况下(即使不设置serialize、deserialize属性)是允许对象序列化和反序列化的。
@JSONField(name="new_password", serialize=false, deserialize=false)
private String password;
源码中format属性的默认值是“”空字符串,我所了解到的是用在日期属性上的格式化,如果有其它的用法可以相互交流学习。
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date currentDate;
通常情况下如果一个 字段的属性值为null时序列化或者反序列化的时候是不会将该字段输出的;
那么我们有没有办法来控制呢?
答案是可以的;
我们可以通过serialzeFeatures、parseFeatures的属性值SerializerFeature.WriteMapNullValue来控制,当属性的值为null时也输出该字段,字段的值为null。
@JSONField(format="yyyy-MM-dd HH:mm:ss", serialzeFeatures=SerializerFeature.WriteMapNullValue)
private Date currentDate;
当然SerializerFeature类中还有很多其他的属性,我会在接下来的章节中讲解。
缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。
@JSONField(ordinal =2)
private String username;
@JSONField(ordinal =3)
private String password;
@JSONField(ordinal =1)
private Date currentDate;
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127886.html原文链接:https://javaforall.cn