FastJson中@JSONField注解使用

来源:互联网 发布:mac os sierra下载 编辑:程序博客网 时间:2024/06/05 03:13

最近做项目中,使用了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值就可以了。

原创粉丝点击