1. 程式人生 > >fastjson(四)JSONField 和 JSONType 介紹

fastjson(四)JSONField 和 JSONType 介紹

一、JSONField 介紹

注意:1、若屬性是私有的,必須有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; }

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

三、使用format配置日期格式化

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

四、使用serialize/deserialize指定欄位不序列化

public class A {
      @JSONField(serialize=false)
      public Date date;
 }

 public class A {
      @JSONField(deserialize=false)
      public Date date;
 }

五、使用ordinal指定欄位的順序

預設fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你可以通過ordinal指定欄位的順序。這個特性需要1.1.42以上版本。

ordinal 預設值為 0

public static class VO {
    @JSONField(ordinal = 3)
    private int f0;

    @JSONField(ordinal = 2)
    private int f1;

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

六、使用serializeUsing制定屬性的序列化類

在fastjson 1.2.16版本之後,JSONField支援新的定製化配置serializeUsing,可以單獨對某一個類的某個屬性定製序列化,比如:

public static class Model {
    @JSONField(serializeUsing = ModelValueSerializer.class)
    public int value;
}

public static class ModelValueSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                      int features) throws IOException {
        Integer value = (Integer) object;
        String text = value + "元";
        serializer.write(text);
    }
}

測試程式碼:

Model model = new Model();
model.value = 100;
String json = JSON.toJSONString(model);
Assert.assertEquals("{\"value\":\"100元\"}", json);

JSONType和JSONField類似,但JSONType配置在類上,而不是field或者getter/setter方法上。這裡就不再介紹了。

下面來看一下具體的程式碼示例:

User 類:

只對id屬性自定義序列化。

package json.fastjson.JSONField;

import java.util.Date;

import com.alibaba.fastjson.annotation.JSONField;

public class User {

    @JSONField(name = "ID", ordinal = 3, serializeUsing = UserIDValueSerializer.class)
    private Long id;
    @JSONField(serialize = false)
    private String name;
    @JSONField(serialize = true, ordinal = 2)
    private String sex;

    @JSONField(deserialize = false)
    private String address;
    @JSONField(deserialize = true)
    private String phone;

    // 配置date序列化和反序列使用yyyyMMdd日期格式
    @JSONField(format = "yyyyMMdd", ordinal = 1)
    private Date date;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}

UserIDValueSerializer 類:

package json.fastjson.JSONField;

import java.io.IOException;
import java.lang.reflect.Type;

import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;

public class UserIDValueSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        //serializer:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":
        //object:100
        //fieldName:ID
        //fieldType:class java.lang.Long
        //features:0
        Long value = (Long) object;
        String text = value + "元";
        serializer.write(text);
    }
}

測試類:

package json.fastjson.JSONField;

import java.util.Date;

import com.alibaba.fastjson.JSON;

public class TestJSONField {

    public static void main(String[] args) {
        User user = new User();
        user.setId(100L);
        user.setName("WaKengMaiNi");
        user.setSex("男");
        user.setAddress("杭州");
        user.setPhone("18603396966");
        user.setDate(new Date());

        // User序列化
        String jsonString = JSON.toJSONString(user);
        System.out.println("User序列化:" + jsonString);
    }
}

輸出結果:

User序列化:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":"100元"}