javajsonfield_FastJson中@JSONField注解使⽤
最近做项⽬中,使⽤了json格式在服务器之间进⾏数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做⼆次处理,将数据处理成我们系统中定义的格式。
思路:
1. 定义需要返回的bean,bean中定义需要返回的数据
2. 获取到需要处理的JSON字符串
3. 将JSON字符串转换为bean, 再将转换后的bean返回给客户端。
由于json中的key与bean中的属性不能匹配,因此在转换过程中出现了部分属性为null的情况。经过查看官⽅⽂档,发现可以使⽤
@JSONField进⾏解释,但是并没有详细的使⽤说明。
@JSONField的作⽤对象:
1. Field
2. Setter 和 Getter⽅法
注:FastJson在进⾏操作时,是根据getter和setter的⽅法进⾏的,并不是依据Field进⾏。
Show me the code:
⼀、作⽤Field
@JSONField作⽤在Field时,其name不仅定义了输⼊key的名称,同时也定义了输出的名称。
代码如下:
importcom.alibaba.fastjson.JSONObject;importcom.alibaba.fastjson.annotation.JSONField;public classPerson {
@JSONField(name="name")privateString name;
@JSONField(name="age")privateString age;
@JSONField(name="desc")privateString desc;publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getAge() {returnage;
}public voidsetAge(String age) {this.age =age;
}publicString getDesc() {returndesc;
}public voidsetDesc(String desc) {this.desc =desc;
}public void setNAME(String NAME) { //没有⽣效,字段上注解中的name的值为"name",则setter为setName
this.name =NAME;
}public void setAGE(String AGE) { //没有⽣效,字段上注解中的name的值为"name",则setter为setAge
this.age =AGE;
}public void setDESC(String DESC) { //没有⽣效,字段上注解中的name的值为"name",则setter为setDesc
this.desc =DESC;
}publicString toString() {JSONString(this);
}
}
importorg.java.json.fastjson.bean.Person;importorg.junit.Before;importorg.junit.Test;importcom.alibaba.fastjson.JSONObject;pu classPersonTest {privatePerson person;/*** 初始化对象*/@Beforepublic voidsetUp() {
person= newPerson();
person.setName("xianglj");
person.setAge("20");
person.setDesc("只是⼀个测试");
}
@Testpublic voidtest() {
String JSONString(person);
System.out.println("bean to json:" +jsonStr);//改变json的key为⼤写
jsonStr =UpperCase();
System.out.println("需要转换的json:" +jsonStr);
person= JavaObject(JSONObject.parseObject(jsonStr), Person.class);
System.out.println("json to bean:" +Name());
}
}
输出如下:
bean to json:{"age":"20","desc":"只是⼀个测试","name":"xianglj"}
需要转换的json:{"AGE":"20","DESC":"只是⼀个测试","NAME":"XIANGLJ"}
json to bean:null
从上⾯我们可以看出,当@JSONField作⽤在Fileld上时,定义了输⼊和输出,如果我们传输过来的json格式不符合这个格式时,则不能够
正确转换。
⼆、作⽤在setter和getter⽅法上
顾名思义,当作⽤在setter⽅法上时,就相当于根据 name 到 json中寻对应的值,并调⽤该setter对象赋值。
当作⽤在getter上时,在bean转换为json时,其key值为name定义的值。实例如下:
importcom.alibaba.fastjson.JSONObject;importcom.alibaba.fastjson.annotation.JSONField;public classProduct {privateString productName;privateString desc;privateString price;
@JSONField(name="name")publicString getProductName() {returnproductName;
}
@JSONField(name="NAME")public voidsetProductName(String productName) {this.productName =productName;
}
@JSONField(name="desc")publicString getDesc() {returndesc;
}
@JSONField(name="DESC") //测试代码中对jsonStr有⼀个toUpperCase的操作。就会这与"DESC"匹配
public voidsetDesc(String desc) {this.desc =desc;
}
@JSONField(name="price")publicString getPrice() {returnprice;
}
@JSONField(name="PRICE")public voidsetPrice(String price) {this.price =price;
}publicString toString() {JSONString(this);
}
}
importorg.java.json.fastjson.bean.Product;importorg.junit.Test;importcom.alibaba.fastjson.JSONObject;/*** 对fastjson中的JSON转换做⼀个测试*/
public classJsonObjectTest {public static voidmain(String[] args) {
Product product= newProduct();
product.setProductName("产品");
product.setDesc("这是⼀个产品");
product.setPrice("22.3");
String JSONString(product);
System.out.println("转换为json:" +JSONString(product));//jsonStr = UpperCase();
System.out.println(jsonStr);
product= JavaObject(JSONObject.parseObject(jsonStr), Product.class);
System.out.String());
}
@Testpublic voidtest() {
Product product= newProduct();
product.setProductName("产品");
product.setDesc("这是⼀个产品");
product.setPrice("22.3");
String JSONString(product);
System.out.println("转换为json:" +JSONString(product));
UpperCase();
System.out.println(jsonStr);
product= JavaObject(JSONObject.parseObject(jsonStr), Product.class);
System.out.String());
}
}
输出如下:
转换为json:{"desc":"这是⼀个产品","name":"产品","price":"22.3"}
{"DESC":"这是⼀个产品","NAME":"产品","PRICE":"22.3"}
{"desc":"这是⼀个产品","name":"产品","price":"22.3"}
有了这个注解之后,我们在转换bean时,就不需要在⼿⼯⽅式,为不能转换的属性进⾏赋值。即使以后返回数据反⽣变化,也能够快速的进⾏修改。不⽤修改⼤⽚代码。只需要修改注解name值就可以了。
这个注解使⽤就到这⾥,希望⼤家喜欢,⽀持
fastjson是⼀款由阿⾥巴巴提供的性能出⾊的json序列化与反序列化库,⽽且使⽤很⽅便,我们可以使⽤JSONString(object)将⼀个对象序列化为json格式,但是如果我们不想把⼀个类的所有成员都序列化怎么办呢。
解决这个问题有两种⽅式:
1.给不想被序列化的属性增加transient属性---java特性
2.给不想被序列化的属性增加增减JSONField(serialize=false)---fastjson特性
友情提醒⼀下:
由于fastjson低版本存在反序列化漏洞,建议⼤家⽤较新版本,⾄少在1.2.28版本以上吧
---------------------
作者:johnHuster
来源:CSDN
版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!
作⽤:在json序列化时将java bean中的⼀些属性忽略掉,序列化和反序列化都受影响。
使⽤⽅法:⼀般标记在属性或者⽅法上,返回的json数据即不包含该属性。
场景模拟:
需要把⼀个List转换成json格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。最后,我希望返回的json数据中不包含这两个快照字段,那么在实体类中快照属性上加注解@JsonIgnore,那么最后返回的json数据,将不会包含goodsInfo和extendsInfo两个属性值。
public class HistoryOrderBean {
/
/基本属性字段
private String insurantName;
private String insuranceName;
private String insurancePrice;
private String insurancePicture;
private String insuranceLimit;
//快照属性字段
@JsonIgnore
private String goodsInfo; //快照基本信息
@JsonIgnore
private String extendsInfo; //快照扩展属性信息
}
fastjson怎么用4.注解失效:
如果注解失效,可能是因为你使⽤的是fastJson,尝试使⽤对应的注解来忽略字段,注解为:@JSONField(serialize = false),使⽤⽅法⼀样。
---------------------
作者:fakerswe
来源:CSDN
版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。