FastJson中@JSONField注解使用

最近作项目中,使用了json格式在服务器之间进行数据传输。可是发现json格式数据不符合JAVA中的变量定义规则,而且难以理解,所以须要在后台中作二次处理,将数据处理成咱们系统中定义的格式。java

思路:json

    1. 定义须要返回的bean,bean中定义须要返回的数据服务器

    2. 获取到须要处理的JSON字符串性能

    3. 将JSON字符串转换为bean, 再将转换后的bean返回给客户端。测试

因为json中的key与bean中的属性不能匹配,所以在转换过程当中出现了部分属性为null的状况。通过查看官方文档,发现可使用@JSONField进行解释,可是并无详细的使用说明。this

@JSONField的做用对象:spa

1. Field
2. Setter 和 Getter方法.net

注:FastJson在进行操做时,是根据getter和setter的方法进行的,并非依据Field进行。code

Show me the code:对象

1、做用Field

@JSONField做用在Field时,其name不只定义了输入key的名称,同时也定义了输出的名称
代码以下:

import com.alibaba.fastjson.JSONObject;  
import com.alibaba.fastjson.annotation.JSONField;  
  
public class Person {  
    @JSONField(name="name")  
    private String name;  
      
    @JSONField(name="age")  
    private String age;  
      
    @JSONField(name="desc")  
    private String desc;  
      
    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;  
    }  
    public String getDesc() {  
        return desc;  
    }  
    public void setDesc(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;  
    }  
      
    public String toString() {  
        return JSONObject.toJSONString(this);  
    }  
}  

 

 

import org.java.json.fastjson.bean.Person;  
import org.junit.Before;  
import org.junit.Test;  
  
import com.alibaba.fastjson.JSONObject;  
  
public class PersonTest {  
  
    private Person person;  
      
    /**  
     * 初始化对象  
     */  
    @Before  
    public void setUp() {  
        person = new Person();  
        person.setName("xianglj");  
        person.setAge("20");  
        person.setDesc("只是一个测试");  
    }  
      
    @Test  
    public void test() {  
        String jsonStr = JSONObject.toJSONString(person);  
        System.out.println("bean to json:" + jsonStr);  
          
        //改变json的key为大写  
        jsonStr = jsonStr.toUpperCase();  
          
        System.out.println("须要转换的json:" + jsonStr);  
        person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);  
        System.out.println("json to bean:" + person.getName());  
    }  
}  

输出以下:

 
bean to json:{"age":"20","desc":"只是一个测试","name":"xianglj"}  
须要转换的json:{"AGE":"20","DESC":"只是一个测试","NAME":"XIANGLJ"}  
json to bean:null  

从上面咱们能够看出,当@JSONField做用在Fileld上时,定义了输入和输出,若是咱们传输过来的json格式不符合这个格式时,则不可以正确转换。

2、做用在setter和getter方法上

顾名思义,看成用在setter方法上时,就至关于根据 name 到 json中寻找对应的值,并调用该setter对象赋值。

看成用在getter上时,在bean转换为json时,其key值为name定义的值。实例以下:

import com.alibaba.fastjson.JSONObject;  
import com.alibaba.fastjson.annotation.JSONField;  
  
public class Product {  
  
    private String productName;  
    private String desc;  
    private String price;  
      
    @JSONField(name="name")  
    public String getProductName() {  
        return productName;  
    }  
      
    @JSONField(name="NAME")  
    public void setProductName(String productName) {  
        this.productName = productName;  
    }  
      
    @JSONField(name="desc")  
    public String getDesc() {  
        return desc;  
    }  
      
    @JSONField(name="DESC")  //测试代码中对jsonStr有一个toUpperCase的操做。就会这与"DESC"匹配
    public void setDesc(String desc) {  
        this.desc = desc;  
    }  
      
    @JSONField(name="price")  
    public String getPrice() {  
        return price;  
    }  
      
    @JSONField(name="PRICE")  
    public void setPrice(String price) {  
        this.price = price;  
    }  
      
    public String toString() {  
        return JSONObject.toJSONString(this);  
    }  
      
}  

 

import org.java.json.fastjson.bean.Product;  
import org.junit.Test;  
  
import com.alibaba.fastjson.JSONObject;  
  
/** 
 * 对fastjson中的JSON转换作一个测试 
*/  
public class JsonObjectTest {  
  
    public static void main(String[] args) {  
        Product product = new Product();  
        product.setProductName("产品");  
        product.setDesc("这是一个产品");  
        product.setPrice("22.3");  
          
        String jsonStr = JSONObject.toJSONString(product);  
        System.out.println("转换为json:" + JSONObject.toJSONString(product));  
          
        //jsonStr = jsonStr.toUpperCase();  
        System.out.println(jsonStr);  
          
        product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);  
        System.out.println(product.toString());  
    }  
      
    @Test  
    public void test() {  
        Product product = new Product();  
        product.setProductName("产品");  
        product.setDesc("这是一个产品");  
        product.setPrice("22.3");  
          
        String jsonStr = JSONObject.toJSONString(product);  
        System.out.println("转换为json:" + JSONObject.toJSONString(product));  
          
        jsonStr = jsonStr.toUpperCase();  
        System.out.println(jsonStr);  
          
        product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);  
        System.out.println(product.toString());  
    }  
} 

输出以下:

转换为json:{"desc":"这是一个产品","name":"产品","price":"22.3"}  
{"DESC":"这是一个产品","NAME":"产品","PRICE":"22.3"}  
{"desc":"这是一个产品","name":"产品","price":"22.3"}  

有了这个注解以后,咱们在转换bean时,就不须要在手工方式,为不能转换的属性进行赋值。即便之后返回数据反生变化,也可以快速的进行修改。不用修改大片代码。只须要修改注解name值就能够了。

这个注解使用就到这里,但愿你们喜欢,支持

http://blog.csdn.net/u011425751/article/details/51219242

 

 

fastjson是一款由阿里巴巴提供的性能出色的json序列化与反序列化库,并且使用很方便,咱们可使用JSON.toJSONString(object)将一个对象序列化为json格式,可是若是咱们不想把一个类的全部成员都序列化怎么办呢。

解决这个问题有两种方式:

1.给不想被序列化的属性增长transient属性---java特性

2.给不想被序列化的属性增长增减JSONField(serialize=false)---fastjson特性

 

友情提醒一下:

因为fastjson低版本存在反序列化漏洞,建议你们用较新版本,至少在1.2.28版本以上吧
---------------------
做者:johnHuster
来源:CSDN
原文:https://blog.csdn.net/john1337/article/details/76276073
版权声明:本文为博主原创文章,转载请附上博文连接!

 

做用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

使用方法:通常标记在属性或者方法上,返回的json数据即不包含该属性。

场景模拟:

须要把一个List<HistoryOrderBean>转换成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; //快照扩展属性信息

}4.注解失效: 若是注解失效,多是由于你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize = false),使用方法同样。--------------------- 做者:fakerswe 来源:CSDN 原文:https://blog.csdn.net/fakerswe/article/details/78626085 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索