首先说一下这个注解:

我在第一次使用的情境,是在springmvc中对于data类型数据格式的处理上面使用的

很早以前使用的只记得在实体类entity中date变量上面加一个注解但是记不大清楚,到底是什么,所以,在网上搜索了一下,没想到竟然是一无所获。

所以在这篇博文上面,记录这个注解:@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进行。

 

介绍完@JSONField之后,针对以上场景,给出JAVA代码

一、作用Field

       @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。代码如下:

 


    1. package org.java.json.fastjson.bean;  
    2.
    3. import com.alibaba.fastjson.JSONObject;
    4. import com.alibaba.fastjson.annotation.JSONField;
    5.
    6. public class Person {
    7.
    8. @JSONField(name="name")
    9. private String name;
    10.
    11. @JSONField(name="age")
    12. private String age;
    13.
    14. @JSONField(name="desc")
    15. private String desc;
    16.
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public String getAge() {
    24. return age;
    25. }
    26. public void setAge(String age) {
    27. this.age = age;
    28. }
    29. public String getDesc() {
    30. return desc;
    31. }
    32. public void setDesc(String desc) {
    33. this.desc = desc;
    34. }
    35.
    36. public void setNAME(String NAME) {
    37. this.name = NAME;
    38. }
    39.
    40. public void setAGE(String AGE) {
    41. this.age = AGE;
    42. }
    43.
    44. public void setDESC(String DESC) {
    45. this.desc = DESC;
    46. }
    47.
    48. public String toString() {
    49. return JSONObject.toJSONString(this);
    50. }
    51. }


      1.  package org.java.json.fastjson.json;  
      2.
      3. import org.java.json.fastjson.bean.Person;
      4. import org.junit.Before;
      5. import org.junit.Test;
      6.
      7. import com.alibaba.fastjson.JSONObject;
      8.
      9. public class PersonTest {
      10.
      11. private Person person;
      12.
      13. /**
      14. * 初始化对象
      15. */
      16. @Before
      17. public void setUp() {
      18. person = new Person();
      19. person.setName("xianglj");
      20. person.setAge("20");
      21. person.setDesc("只是一个测试");
      22. }
      23.
      24. @Test
      25. public void test() {
      26. jsonStr = JSONObject.toJSONString(person);
      27. System.out.println("bean to json:" + jsonStr);
      28.
      29. //改变json的key为大写
      30. jsonStr = jsonStr.toUpperCase();
      31.
      32. System.out.println("需要转换的json:" + jsonStr);
      33. person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
      34. System.out.println("json to bean:" + person.getName());
      35. }
      36. }



      输出如下:

       

       

      1. "age":"20","desc":"只是一个测试","name":"xianglj"}  
      2. "AGE":"20","DESC":"只是一个测试","NAME":"XIANGLJ"}
      3. null


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

       

       

      二、作用在setter和getter方法上

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

      当作用在getter上时,在bean转换为json时,其key值为name定义的值。实例如下:

       


        1. "code" class="java">package org.java.json.fastjson.bean;  
        2.
        3. import com.alibaba.fastjson.JSONObject;
        4. import com.alibaba.fastjson.annotation.JSONField;
        5.
        6. public class Product {
        7.
        8. private String productName;
        9. private String desc;
        10. private String price;
        11.
        12. @JSONField(name="name")
        13. public String getProductName() {
        14. return productName;
        15. }
        16.
        17. @JSONField(name="NAME")
        18. public void setProductName(String productName) {
        19. this.productName = productName;
        20. }
        21.
        22. @JSONField(name="desc")
        23. public String getDesc() {
        24. return desc;
        25. }
        26.
        27. @JSONField(name="DESC")
        28. public void setDesc(String desc) {
        29. this.desc = desc;
        30. }
        31.
        32. @JSONField(name="price")
        33. public String getPrice() {
        34. return price;
        35. }
        36.
        37. @JSONField(name="PRICE")
        38. public void setPrice(String price) {
        39. this.price = price;
        40. }
        41.
        42. public String toString() {
        43. return JSONObject.toJSONString(this);
        44. }
        45.
        46. }


         

        1. package org.java.json.fastjson.json;  
        2.
        3. import org.java.json.fastjson.bean.Product;
        4. import org.junit.Test;
        5.
        6. import com.alibaba.fastjson.JSONObject;
        7.
        8. /**
        9. * 对fastjson中的JSON转换做一个测试
        10. * @author xianglj
        11. */
        12. public class JsonObjectTest {
        13.
        14. public static void main(String[] args) {
        15. new Product();
        16. "产品");
        17. "这是一个产品");
        18. "22.3");
        19.
        20. String jsonStr = JSONObject.toJSONString(product);
        21. "转换为json:" + JSONObject.toJSONString(product));
        22.
        23. //jsonStr = jsonStr.toUpperCase();
        24. System.out.println(jsonStr);
        25.
        26. class);
        27. System.out.println(product.toString());
        28. }
        29.
        30. @Test
        31. public void test() {
        32. new Product();
        33. "产品");
        34. "这是一个产品");
        35. "22.3");
        36.
        37. String jsonStr = JSONObject.toJSONString(product);
        38. "转换为json:" + JSONObject.toJSONString(product));
        39.
        40. jsonStr = jsonStr.toUpperCase();
        41. System.out.println(jsonStr);
        42.
        43. class);
        44. System.out.println(product.toString());
        45. }
        46. }


        输出如下:

         

        1. "desc":"这是一个产品","name":"产品","price":"22.3"}  
        2. "DESC":"这是一个产品","NAME":"产品","PRICE":"22.3"}
        3. "desc":"这是一个产品","name":"产品","price":"22.3"}


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