1. 程式人生 > >FastJSON將Java物件轉為json,日期顯示時間戳未格式化解決辦法

FastJSON將Java物件轉為json,日期顯示時間戳未格式化解決辦法

JSON版本:FastJson

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
}

可以使用 JSON.toJSONString() 將 Java 物件轉換換為 JSON 物件:

private List<Person> listOfPersons = new ArrayList<Person>();
 
@Before
public void setUp() {
    listOfPersons.add(new Person(15, "John Doe", new Date()));
    listOfPersons.add(new Person(20, "Janette Doe", new Date()));
}
 
@Test
public void whenJavaList_thanConvertToJsonCorrect() {
    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"
    }
]

我們還可以自定義輸出,並控制欄位的排序,日期顯示格式,序列化標記等。

接下來我們更新 bean 並新增幾個欄位:

@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;

以上程式碼中我們列出了基本引數類別,並使用 @JSONField 註解,以便實現自定義轉換:

  • format* 引數用於格式化 date* 屬性。
  • 預設情況下, FastJson 庫可以序列化 Java bean 實體, 但我們可以使用 *serialize* 指定欄位不序列化。
  • 使用 *ordinal* 引數指定欄位的順序

這樣,以上輸出結果為:

[
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Jhon",
        "DATE OF BIRTH":"19/07/2016"
    },
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Janette",
        "DATE OF BIRTH":"19/07/2016"
    }
]

@JSONField

@JSONField 的作用物件:

  • Field
  • Setter 和 Getter 方法

注意:FastJson 在進行操作時,是根據 getter 和 setter 的方法進行的,並不是依據 Field 進行。

注意:若屬性是私有的,必須有 set 方法。否則無法反序列化。

package com.alibaba.fastjson.annotation;

public @interface JSONField {
    // 配置序列化和反序列化的順序,1.1.42版本之後才支援
    int ordinal() default 0;

     // 指定欄位的名稱
    String name() default "";

    // 指定欄位的格式,對日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}

2. JSONField 配置方式

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

2.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;}
}

2.2 配置在 field 上

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

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

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;
 }

5. 使用 ordinal 指定欄位的順序

預設 fastjson 序列化一個 java bean,是根據 fieldName 的字母序進行序列化的,你可以通過 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;
}