当前位置: 首页 > 教程 > Fastjson >

Fastjson @JSONField

精华
小牛编辑
121浏览
2023-03-14

1 @JSONField注解介绍

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使用的位置

可以把@JSONField配置在字段或者getter/setter方法上,例如:

2.1 配置在字段上

public class VO {
     @JSONField(name="ID")
     private int id;

     @JSONField(name="birthday",format="yyyy-MM-dd")
     public Date date;
}

2.2 配置在getter/setter方法上

public class VO {
    private int id;

    @JSONField(name="ID")
    public int getId() { return id;}

    @JSONField(name="ID")
    public void setId(int id) {this.id = id;}
}

注意:若属性是私有的,必须有setter方法。否则无法反序列化。

3 format属性格式化日期

可以使用format属性定制化配置各个日期字段的格式化,如下:

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

4 serialize属性指定字段是否序列化

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

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

5 ordinal属性指定字段顺序

缺省Fastjson序列化一个JavaBean,是根据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;
}

6 serializeUsing定制序列化类

在Fastjson 1.2.16版本之后,JSONField支持新的定制化配置serializeUsing,可以单独对某一个类的某个属性定制序列化,比如:

6.1 定制序列化类

Model类:

package cn.xnip.fastjson;

import com.alibaba.fastjson.annotation.JSONField;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class Model {
    @JSONField(serializeUsing = ModelValueSerializer.class)
    public int value;
}
ModelValueSerializer类:
package cn.xnip.fastjson;

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

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

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public 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);
    }
}

6.2 编写测试类

MainApp:

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        Model model = new Model();
        model.value = 100;
        String json = JSON.toJSONString(model);
        System.out.println(json);
    }

}

6.3 运行结果

{"value":"100元"}