文章目录

  • 一. Fastjson概述
  • 二. Fastjson的常用方法
  • 1. Java对象-> JSON字符串
  • 2. JSON 字符串->Java 对象
  • 3. 创建JSON对象
  • 三. @JSONField注解
  • 1. @JSONField注解概述
  • 2. @JSONField的配置方式
  • 1. `name`:序列化对象的名称
  • 2. `ordinal`:指定字段的顺序
  • 3. `format `:格式化 Date 属性
  • 4. `serialize/deserialize `:指定不序列化/反序列化的字段
  • 5. 示例
  • 四. 反序列化的其他情况
  • 参考资料



一. Fastjson概述

  1. Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。
  • toJSONString()方法:(序列化)将json对象转换成JSON字符串;
  • parseObject()方法:(反序列化)将JSON字符串转换成json对象。
  1. 注意
  1. FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行,因此实体类必须有getter和setter方法。
  2. 若属性是私有的,必须有 setter方法,否则无法反序列化。
  1. Fastjson的maven依赖
  • maven中央仓库下载:http://repo1.maven.org/maven2/com/alibaba/fastjson/
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>x.x.x</version>
</dependency>

二. Fastjson的常用方法

1. Java对象-> JSON字符串

  • JSON.toJSONString():将 Java 对象转换为 JSON 字符串。
// 	定义Person JavaBean
public class Person {
     
    @JSONField(name = "AGE")
    private int age;
 
    @JSONField(name = "FULL NAME")
    private String fullName;
 
    @JSONField(name = "DATE OF BIRTH")
    private Date dateOfBirth;
 
    public Person(int age, String fullName, Date dateOfBirth) {
        super();
        this.age = age;
        this.fullName= fullName;
        this.dateOfBirth = dateOfBirth;
    }
 
    // 标准 getters & setters方法:必须写
}

// 测试
public class StrToJsonTest {
	private List<Person> listOfPersons = new ArrayList<Person>();
    public static void main(String[] args) {	
		listOfPersons.add(new Person(15, "John Doe", new Date()));
		listOfPersons.add(new Person(20, "Janette Doe", new Date()));
		
		// 执行toJSONString()方法
		String jsonOutput= JSON.toJSONString(listOfPersons);
}
  • 输出结果
[  
    {  
        "AGE":15,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"John Doe"
    },
    {  
        "AGE":20,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"Janette Doe"
    }
]

2. JSON 字符串->Java 对象

  • JSON.parseObject(): 将 JSON 字符串转换为 Java 对象。
  • 注意:该方法反序列化为对象时,必须要有默认无参的构造函数,否则会报异常。
@Test
public void whenJson_thanConvertToObjectCorrect() {
    Person person = new Person(20, "John "Doe", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);
}
  • 运行结果

Person [age=20, fullName=John Doe, dateOfBirth=Wed Jul 20 08:51:12 WEST 2016]

3. 创建JSON对象

  1. 创建 JSON 对象的方法:使用 JSONObject 和 JSONArray对象。
  2. JSONObject (fastJson提供的json对象):我们可以把JSONObject 当成一个 Map<String,Object> ,源码如下:
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {
    private static final long serialVersionUID = 1L;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private final Map<String, Object> map;
  1. JSONArray(fastJson提供json数组对象):我们可以把 JSONArray 当做一个 List,其源码如下。因此, JSONArray 可以看成是 JSONObject 对象的一个集合。
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {
    private static final long serialVersionUID = 1L;
    private final List<Object> list;
    protected transient Object relatedArray;
    protected transient Type componentType;
  1. 示例
@Test
public void whenGenerateJson_thanGenerationCorrect() throws ParseException {
    JSONArray jsonArray = new JSONArray(); // 创建JSONArray对象
    for (int i = 0; i < 2; i++) {
        JSONObject jsonObject = new JSONObject(); // 创建JSONObject对象
        jsonObject.put("AGE", 10);
        jsonObject.put("FULL NAME", "Doe " + i);
        jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
        jsonArray.add(jsonObject);
    }
    String jsonOutput = jsonArray.toJSONString();
}
  • 运行结果
[
   {
      "AGE":"10",
      "DATE OF BIRTH":"2016/12/12 12:12:12",
      "FULL NAME":"Doe 0"
   },
   {
      "AGE":"10",
      "DATE OF BIRTH":"2016/12/12 12:12:12",
      "FULL NAME":"Doe 1"
   }
]

三. @JSONField注解

1. @JSONField注解概述

  1. @JSONField的作用对象
    (1)Field
    (2)Setter和Getter 方法

2. @JSONField的配置方式

  • 以下所有的注解属性都可以用在Field或setter和getter上。

1. name:序列化对象的名称

  1. 配置在 getter/setter 上
public class A {
      private int id;
 
      @JSONField(name="ID")
      public int getId() {return id;}
      @JSONField(name="ID")
      public void setId(int value) {this.id = id;}
}
  1. 配置在 field 上
public class A {
      @JSONField(name="ID")
      private int id;
 
      public int getId() {return id;}
      public void setId(int value) {this.id = id;}
 }

2. ordinal:指定字段的顺序

  • 这个特性需要 1.1.42 以上版本。
public static class VO {
    @JSONField(ordinal = 3)
    private int f0;

    @JSONField(ordinal = 2)
    private int f1;

    @JSONField(ordinal = 1)
    private int f2;
}

3. format:格式化 Date 属性

  • 配置date序列化和反序列使用yyyyMMdd日期格式。
public class A {
      // 配置date序列化和反序列使用yyyyMMdd日期格式
      @JSONField(format="yyyyMMdd")
      public Date date;
 }

4. serialize/deserialize:指定不序列化/反序列化的字段

  • 默认情况下,所有属性都会序列化。
public class A {
      @JSONField(serialize=false) //指定序列化操作时,不序列化的字段
      public Date date;
 }

 public class A {
      @JSONField(deserialize=false) //指定反序列化时,不反序列化的字段
      public Date date;
 }
  • 如:指定字段不反序列化
@JSONField(name = "DATE OF BIRTH", deserialize=false)
private Date dateOfBirth;
  • 输出结果

Person [age=20, fullName=John Doe, dateOfBirth=null]

5. 示例

@JSONField(name="AGE", serialize=false)
private int age;
 
@JSONField(name="LAST NAME", ordinal = 2)
private String lastName;
 
@JSONField(name="FIRST NAME", ordinal = 1)
private String firstName;
 
@JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)
private Date dateOfBirth;
  • 输出结果为:
[
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Jhon",
        "DATE OF BIRTH":"19/07/2016"
    },
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Janette",
        "DATE OF BIRTH":"19/07/2016"
    }
]

四. 反序列化的其他情况

  1. 实体类
public class Person {

    private int age;
    private String fullName;

	public Person(){}

    public Person(int age, String fullName) {
        super();
        this.age = age;
        this.fullName= fullName;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", fullName='" + fullName + '\'' +
                '}';
    }
    
	//getter and setter

}
  1. 测试
public class StrToJsonTest {
    public static void main(String[] args) {
	    // 正常
		String jsonObject1 = "{\"age\":20,\"fullName\":\"sad\",}";
		Person newPerson1 = JSON.parseObject(jsonObject1, Person.class);
		System.out.println(newPerson1);
		
		// 反序列化时,缺失的属性不会被反序列化
		String jsonObject2 = "{\"age\":20}";
		Person newPerson2 = JSON.parseObject(jsonObject2, Person.class);
		System.out.println(newPerson2);
		
		// 反序列化时,多余的属性不会被反序列化
		String jsonObject3 = "{\"Age\":20,\"fullName\":\"sad\",\"dateOfBirth\":\"201888\"}";
		Person newPerson3 = JSON.parseObject(jsonObject3, Person.class);
		System.out.println(newPerson3);
    }
  • 运行结果
Person{age=20, fullName='sad'} 
Person{age=20, fullName='null'}
Person{age=20, fullName='sad'}

参考资料

FastJson简明教程