@JSONField注解可以用在方法(method),属性(field)以及方法中的参数(parameter)上。JSONField中的name属性用来指定JSON串中key的名称。
Demo:
@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。
public class Person {@JSONField(name = "name") // 注意观察生成的JSON串中name和age的区别private String name;@JSONField(name = "AGE")private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
@JSONField也可以直接作用在get或set方法上
@JSONField(name = "name")
public String getName() {
return name;
}
@JSONField(name = "name")
public void setName(String name) {
this.name = name;
}
@JSONField(name = "AGE")
public String getAge() {
return age;
}
@JSONField(name = "AGE")
public void setAge(String age) {
this.age = age;
}
PS:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。
public class PersonTest {
private Person person;
/**
* 初始化对象
*/
@Before
public void setUp() {
person = new Person();
person.setName("gyl");
person.setAge("20");
}
@Test
public void test() {
String jsonStr = JSONObject.toJSONString(person);
System.out.println("bean to json:" + jsonStr);
person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
System.out.println("json to bean:" + person.getName());
}
}
Output:
bean to json:{"AGE":"20","name":"gyl"}
json to bean:gyl
JSONField默认支持的类型
public @interface JSONField {
int ordinal() default 0;
String name() default "";
String format() default "";
boolean serialize() default true;
boolean deserialize() default true;
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
String label() default "";
boolean jsonDirect() default false;
Class<?> serializeUsing() default Void.class;
Class<?> deserializeUsing() default Void.class;
String[] alternateNames() default {};
boolean unwrapped() default false;
}
format规定日期格式
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;
ordinal规定字段的顺序
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
fastjson序列化⼀个java bean,是根据fieldName的字母序进⾏序列的你可以通过ordinal指定字段的顺序。
serialize/deserialize指定字段不序列化
@JSONField(serialize=false)
public Date date;
SerializerFeature
| 名称 | 含义 | 备注 |
|---|---|---|
| QuoteFieldNames | 输出key时是否使用双引号,默认为true | |
| UseSingleQuotes | 使用单引号而不是双引号,默认为false | |
| WriteMapNullValue | 是否输出值为null的字段,默认为false | |
| WriteEnumUsingToString | Enum输出name()或者original,默认为false | |
| UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false | |
| WriteNullListAsEmpty | List字段如果为null,输出为[],而非null | |
| WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null | |
| WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null | |
| WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null | |
| SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true | |
| SortField | 按字段名称排序后输出。默认为false | |
| WriteTabAsSpecial | 把\t做转义输出,默认为false | 不推荐 |
| PrettyFormat | 结果是否格式化,默认为false | |
| WriteClassName | 序列化时写入类型信息,默认为false。反序列化是需用到 | |
| DisableCircularReferenceDetect | 消除对同一对象循环引用的问题,默认为false | |
| WriteSlashAsSpecial | 对斜杠’/’进行转义 | |
| BrowserCompatible | 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false | |
| WriteDateUseDateFormat | 全局修改日期格式,默认为false。 | JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); |
| DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false | |
| NotWriteRootClassName | 不打印最外层根对象的类名,例如一个DO里面引入了另一个DO,外层DO不会打印类名 | |
| BeanToArray | 将对象转为array输出 | |
| WriteNonStringKeyAsString | 如果key不是String则转化为String | |
| NotWriteDefaultValue | 值有默认值的情况下,改变其值 | |
| BrowserSecure | 含义 | |
| IgnoreNonFieldGetter | 当get方法的字段值与类的成员变量名不一致时,则不进行序列化了 | |
| WriteEnumUsingName | 默认为 true, fastjson 默认输出枚举类型的 name 值,如果想要输出其 ordinal 值, 将其值设置为 false |
