FastJson中@JSONField注解使用

àì夳堔傛蜴生んèń 2022-08-21 06:57 189阅读 0赞

最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。

思路:

  1. 1. 定义需要返回的bean,bean中定义需要返回的数据
  2. 2. 获取到需要处理的JSON字符串
  3. 3. JSON字符串转换为bean, 再将转换后的bean返回给客户端。

由于json中的key与bean中的属性不能匹配,因此在转换过程中出现了部分属性为null的情况。经过查看官方文档,发现可以使用@JSONField进行解释,但是并没有详细的使用说明。

@JSONField的作用对象:

  1. Field

    1. Setter 和 Getter方法

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

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

一、作用Field

  1. @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。代码如下:
  2. package org.java.json.fastjson.bean;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.annotation.JSONField;
  5. public class Person {
  6. @JSONField(name="name")
  7. private String name;
  8. @JSONField(name="age")
  9. private String age;
  10. @JSONField(name="desc")
  11. private String desc;
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getAge() {
  19. return age;
  20. }
  21. public void setAge(String age) {
  22. this.age = age;
  23. }
  24. public String getDesc() {
  25. return desc;
  26. }
  27. public void setDesc(String desc) {
  28. this.desc = desc;
  29. }
  30. public void setNAME(String NAME) {
  31. this.name = NAME;
  32. }
  33. public void setAGE(String AGE) {
  34. this.age = AGE;
  35. }
  36. public void setDESC(String DESC) {
  37. this.desc = DESC;
  38. }
  39. public String toString() {
  40. return JSONObject.toJSONString(this);
  41. }
  42. }
  43. package org.java.json.fastjson.json;
  44. import org.java.json.fastjson.bean.Person;
  45. import org.junit.Before;
  46. import org.junit.Test;
  47. import com.alibaba.fastjson.JSONObject;
  48. public class PersonTest {
  49. private Person person;
  50. /**
  51. * 初始化对象
  52. */
  53. @Before
  54. public void setUp() {
  55. person = new Person();
  56. person.setName("xianglj");
  57. person.setAge("20");
  58. person.setDesc("只是一个测试");
  59. }
  60. @Test
  61. public void test() {
  62. String jsonStr = JSONObject.toJSONString(person);
  63. System.out.println("bean to json:" + jsonStr);
  64. //改变json的key为大写
  65. jsonStr = jsonStr.toUpperCase();
  66. System.out.println("需要转换的json:" + jsonStr);
  67. person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
  68. System.out.println("json to bean:" + person.getName());
  69. }
  70. }

输出如下:

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

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

二、作用在setter和getter方法上

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

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

  1. <pre name="code" class="java">package org.java.json.fastjson.bean;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson.annotation.JSONField;
  4. public class Product {
  5. private String productName;
  6. private String desc;
  7. private String price;
  8. @JSONField(name="name")
  9. public String getProductName() {
  10. return productName;
  11. }
  12. @JSONField(name="NAME")
  13. public void setProductName(String productName) {
  14. this.productName = productName;
  15. }
  16. @JSONField(name="desc")
  17. public String getDesc() {
  18. return desc;
  19. }
  20. @JSONField(name="DESC")
  21. public void setDesc(String desc) {
  22. this.desc = desc;
  23. }
  24. @JSONField(name="price")
  25. public String getPrice() {
  26. return price;
  27. }
  28. @JSONField(name="PRICE")
  29. public void setPrice(String price) {
  30. this.price = price;
  31. }
  32. public String toString() {
  33. return JSONObject.toJSONString(this);
  34. }
  35. }
  36. package org.java.json.fastjson.json;
  37. import org.java.json.fastjson.bean.Product;
  38. import org.junit.Test;
  39. import com.alibaba.fastjson.JSONObject;
  40. /**
  41. * 对fastjson中的JSON转换做一个测试
  42. * @author xianglj
  43. */
  44. public class JsonObjectTest {
  45. public static void main(String[] args) {
  46. Product product = new Product();
  47. product.setProductName("产品");
  48. product.setDesc("这是一个产品");
  49. product.setPrice("22.3");
  50. String jsonStr = JSONObject.toJSONString(product);
  51. System.out.println("转换为json:" + JSONObject.toJSONString(product));
  52. //jsonStr = jsonStr.toUpperCase();
  53. System.out.println(jsonStr);
  54. product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
  55. System.out.println(product.toString());
  56. }
  57. @Test
  58. public void test() {
  59. Product product = new Product();
  60. product.setProductName("产品");
  61. product.setDesc("这是一个产品");
  62. product.setPrice("22.3");
  63. String jsonStr = JSONObject.toJSONString(product);
  64. System.out.println("转换为json:" + JSONObject.toJSONString(product));
  65. jsonStr = jsonStr.toUpperCase();
  66. System.out.println(jsonStr);
  67. product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
  68. System.out.println(product.toString());
  69. }
  70. }

输出如下:

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

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

这个注解使用就到这里,希望大家喜欢,支持。

发表评论

表情:
评论列表 (有 0 条评论,189人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Fastjson @JsonField注解使用

    【引言】 在开发中,不论是前后端联调,还是与第三方对接,有时候难免会遇到对方定义的json数据中的key值与自己后端定义的实体字段不一致的情况,也有时候会遇到前端传的日期数据