EchoDemo's Blogs

JSONField注解

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

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

2、JSONField配置方式

(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)配置在属性上

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

(5)使⽤ordinal指定字段的顺序

public static class VO {

    @JSONField(ordinal = 3)
    private int f0;

    @JSONField(ordinal = 2)
    private int f1;

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

缺省fastjson序列化一个java bean,是根据fieldName的字母序进⾏序列的你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。

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

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

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import java.io.IOException;
import java.lang.reflect.Type;

public class MyTest {
    public static class A {
        @JSONField(serializeUsing = AValueSerializer.class)
        public int value;
    }

    public static class AValueSerializer 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);
        }
    }

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

(7)JSONField jsonDirect

在fastjson-1.2.12版本中,JSONField⽀持⼀个新的配置项jsonDirect,它的作⽤是:当你有⼀个字段是字符串类型,⾥⾯是json格式数据,你希望直接输出,⽽不是经过转义之后再输出。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;

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

public class MyTest {
    public static void main(String[] args) {
        B b = new B();
        b.id = 9999;
        b.value = "{}";
        String json = JSON.toJSONString(b);
        System.out.println(json);
    }

    public static class B{
        public int id;

        @JSONField(jsonDirect = true)
        public String value;
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------