转载

fastjson解决对象空值转换成JSON丢失字段的问题

摘自:https://blog.csdn.net/akili_007/article/details/74385612,https://blog.csdn.net/qq_35936272/article/details/77357272

频繁的转换JSON  结果导致空值字段丢失   

但是对于前端来说即使字段值为空也需要返回

所以这个时候就需要做处理  

我是用的是  import com.alibaba.fastjson.JSON;

下面以代码为例  :


  1. 依赖:
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.7</version>
  6. </dependency>


  1. @Data
  2. public class Person implements Serializable { //创建一个实体
  3. /**
  4. *
  5. */
  6. private static final long serialVersionUID = 3193754045080382621L;
  7. private String name;
  8. private Integer sex;
  9. private Integer age;
  10. private String school;
  11. }

  1. public static void main(String[] args) { //测试
  2.    Person p = new Person();
  3.    p.setName("Akili");
  4.    p.setSex(1);
  5.    p.setAge(24);
  6.    p.setSchool(null);
  7.    String pJson = JSON.toJSONString(p);
  8.    System.out.println("pJson  --- " + pJson);
  9.    String pJson2 = JSON.toJSONString(p, SerializerFeature.WriteMapNullValue);
  10.    System.out.println("pJson2  --- " + pJson2);
  11.    String pJson3 = JSON.toJSONString(p, SerializerFeature.WriteNullStringAsEmpty);
  12.    System.out.println("pJson3  --- " + pJson3);
  13. }


由此可见,当使用重载方法传入一个序列化参数的时候

设置为null的字段依然存在

可以设置null值为null,也可以设置为""

灵活运用

如果要将一个JSON串转换成为一个对象或其他指定类型的话

以下代码:


  1. @Data
  2. public class Person implements Serializable { //创建一个实体
  3. /**
  4. *
  5. */
  6. private static final long serialVersionUID = 3193754045080382621L;
  7. private String name;
  8. private Integer sex;
  9. private Integer age;
  10. private String school;
  11. }




  1. public static void main(String[] args) {//测试
  2. Person p = new Person();
  3. p.setName("Akili");
  4. p.setSex(1);
  5. p.setAge(24);
  6. p.setSchool(null);
  7. String pJson = JSON.toJSONString(p);
  8. System.out.println("pJson --- " + pJson);
  9. String pJson2 = JSON.toJSONString(p, SerializerFeature.WriteMapNullValue);
  10. System.out.println("pJson2 --- " + pJson2);
  11. String pJson3 = JSON.toJSONString(p, SerializerFeature.WriteNullStringAsEmpty);
  12. System.out.println("pJson3 --- " + pJson3);
  13. Person newP2 = JSON.parseObject(pJson2, Person.class);
  14. System.out.println(newP2.toString());
  15. Person newP3 = JSON.parseObject(pJson3, Person.class);
  16. System.out.println(newP3.toString());
  17. }



  1. //输出结果
  2. pJson --- {"age":24,"name":"Akili","sex":1}
  3. pJson2 --- {"age":24,"name":"Akili","school":null,"sex":1}
  4. pJson3 --- {"age":24,"name":"Akili","school":"","sex":1}
  5. Person(name=Akili, sex=1, age=24, school=null)
  6. Person(name=Akili, sex=1, age=24, school=)

json属性顺序问题

1. JSONField 介绍

  1. package com.alibaba.fastjson.annotation;
  2. public @interface JSONField {
  3. // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
  4. int ordinal() default 0;
  5. // 指定字段的名称
  6. String name() default "";
  7. // 指定字段的格式,对日期格式有用
  8. String format() default "";
  9. // 是否序列化
  10. boolean serialize() default true;
  11. // 是否反序列化
  12. boolean deserialize() default true;
  13. }

2. JSONField配置方式

FieldInfo可以配置在getter/setter方法或者字段上。例如:

2.1 配置在getter/setter上

  1. public class A {
  2. private int id;
  3. @JSONField(name="ID")
  4. public int getId() {return id;}
  5. @JSONField(name="ID")
  6. public void setId(int value) {this.id = id;}
  7. }

2.2 配置在field上

  1. public class A {
  2. @JSONField(name="ID")
  3. private int id;
  4. public int getId() {return id;}
  5. public void setId(int value) {this.id = id;}
  6. }

3. 使用format配置日期格式化

  1. public class A {
  2. // 配置date序列化和反序列使用yyyyMMdd日期格式
  3. @JSONField(format="yyyyMMdd")
  4. public Date date;
  5. }

4. 使用serialize/deserialize指定字段不序列化

  1. public class A {
  2. @JSONField(serialize=false)
  3. public Date date;
  4. }

5. 使用ordinal指定字段的顺序

缺省fastjson序列化一个Java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。

  1. public static class VO {
  2. @JSONField(ordinal = 3)
  3. private int f0;
  4. @JSONField(ordinal = 2)
  5. private int f1;
  6. @JSONField(ordinal = 1)
  7. private int f2;
  8. }

正文到此结束
Loading...