zoukankan      html  css  js  c++  java
  • 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);  
        }  
    }  
    复制代码
     

    输出如下:

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

  • 相关阅读:
    echarts中图表过于靠左或靠右的情况解决办法。
    C#语法糖大汇总【转发】
    近期对于windows服务的理解
    解决echarts中X轴文字过长的问题。【转】
    两个页面之间通过后台处理,调用父窗体方法。
    docker
    docker php
    webpack
    jwt 解密
    阿里云服务器 ECS Linux 主机删除文件后磁盘空间显示不变(转载https://www.zhanqunfuwuqi.com/archives/5293)
  • 原文地址:https://www.cnblogs.com/javalinux/p/15493104.html
Copyright © 2011-2022 走看看