最近做项目中,使用了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的名称,同时也定义了输出的名称
代码如下:

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.alibaba.fastjson.annotation.JSONField;
  3. public class Person {
  4. @JSONField(name="name")
  5. private String name;
  6. @JSONField(name="age")
  7. private String age;
  8. @JSONField(name="desc")
  9. private String desc;
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getAge() {
  17. return age;
  18. }
  19. public void setAge(String age) {
  20. this.age = age;
  21. }
  22. public String getDesc() {
  23. return desc;
  24. }
  25. public void setDesc(String desc) {
  26. this.desc = desc;
  27. }
  28. public void setNAME(String NAME) { //没有生效,字段上注解中的name的值为"name",则setter为setName
  29. this.name = NAME;
  30. }
  31. public void setAGE(String AGE) { //没有生效,字段上注解中的name的值为"name",则setter为setAge
  32. this.age = AGE;
  33. }
  34. public void setDESC(String DESC) { //没有生效,字段上注解中的name的值为"name",则setter为setDesc
  35. this.desc = DESC;
  36. }
  37. public String toString() {
  38. return JSONObject.toJSONString(this);
  39. }
  40. }

 

 

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

输出如下:

 
  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. import com.alibaba.fastjson.JSONObject;
  2. import com.alibaba.fastjson.annotation.JSONField;
  3. public class Product {
  4. private String productName;
  5. private String desc;
  6. private String price;
  7. @JSONField(name="name")
  8. public String getProductName() {
  9. return productName;
  10. }
  11. @JSONField(name="NAME")
  12. public void setProductName(String productName) {
  13. this.productName = productName;
  14. }
  15. @JSONField(name="desc")
  16. public String getDesc() {
  17. return desc;
  18. }
  19. @JSONField(name="DESC") //测试代码中对jsonStr有一个toUpperCase的操作。就会这与"DESC"匹配
  20. public void setDesc(String desc) {
  21. this.desc = desc;
  22. }
  23. @JSONField(name="price")
  24. public String getPrice() {
  25. return price;
  26. }
  27. @JSONField(name="PRICE")
  28. public void setPrice(String price) {
  29. this.price = price;
  30. }
  31. public String toString() {
  32. return JSONObject.toJSONString(this);
  33. }
  34. }

 

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

输出如下:

  1. 转换为json:{"desc":"这是一个产品","name":"产品","price":"22.3"}
  2. {"DESC":"这是一个产品","NAME":"产品","PRICE":"22.3"}
  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
版权声明:本文为博主原创文章,转载请附上博文链接!

 

版权声明:本文为softidea原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/softidea/p/5681928.html