1. JSONField 介绍

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

  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 = "yyyy-MM-dd HH:mm:ss")
  4. public Date date;
  5. }

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

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

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

6. 使用 serializeUsing 制定属性的序列化类

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

  1. public static class Model {
  2. @JSONField(serializeUsing = ModelValueSerializer.class)
  3. public int value;
  4. }
  5. public static class ModelValueSerializer implements ObjectSerializer {
  6. @Override
  7. public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
  8. int features) throws IOException {
  9. Integer value = (Integer) object;
  10. String text = value + "元";
  11. serializer.write(text);
  12. }
  13. }

测试代码

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