• 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的名称,同时也定义了输出的名称
    代码如下:

    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格式不符合这个格式时,则不能够正确转换。

    二、作用在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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/softidea/p/5681928.html
Copyright © 2020-2023  润新知