首先说一下这个注解:
我在第一次使用的情境,是在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值就可以了。