Champ JSON Fastjson
Fastjson JSONField
1. Introduction à JSONField
Remarque : 1. Si l'attribut est privé, il doit y avoir une méthode set*. Sinon, il ne peut pas être désérialisé.
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. Méthode de configuration JSONField
FieldInfo peut être configuré sur la méthode ou le champ getter/setter. Par exemple :
2.1 configuré sur 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 configuré sur le champ
public class A { @JSONField(name="ID") private int id; public int getId() {return id;} public void setId(int value) {this.id = id;} }
3. Utilisez le format pour configurer le formatage de la date
public class A { // 配置date序列化和反序列使用yyyyMMdd日期格式 @JSONField(format="yyyyMMdd") public Date date; }
.
4 . Utilisez sérialiser/désérialiser pour spécifier que les champs ne sont pas sérialiséspublic class A { @JSONField(serialize=false) public Date date; } public class A { @JSONField(deserialize=false) public Date date; }
5. Utilisez ordinal pour spécifier l'ordre des champs
Par défaut, fastjson sérialise un bean Java, qui est sérialisé selon l'ordre alphabétique de fieldName You. peut passer un ordinal spécifie l'ordre des champs. Cette fonctionnalité nécessite la version 1.1.42 ou supérieure.
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
6. 使用serializeUsing制定属性的序列化类
Après la version 1.2.16 de fastjson, JSONField prend en charge la nouvelle configuration personnalisée serializeUsing, qui peut personnaliser individuellement la sérialisation d'un certain attribut d'une classe, tel que :
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); } }
Code de test
Model model = new Model(); model.value = 100; String json = JSON.toJSONString(model); Assert.assertEquals("{\"value\":\"100元\"}", json);
7. JSONField alternateNames
Fastjson fournit une fonctionnalité empruntée à gson dans la version 1.2.21, qui prend en charge l'utilisation de plusieurs noms de champs différents lors de la désérialisation.
Demo
public static class Model { public int id; @JSONField(alternateNames = {"user", "person"}) public String name; } String jsonVal0 = "{\"id\":5001,\"name\":\"Jobs\"}"; String jsonVal1 = "{\"id\":5382,\"user\":\"Mary\"}"; String jsonVal2 = "{\"id\":2341,\"person\":\"Bob\"}"; Model obj0 = JSON.parseObject(jsonVal0, Model.class); assertEquals(5001, obj0.id); assertEquals("Jobs", obj0.name); Model obj1 = JSON.parseObject(jsonVal1, Model.class); assertEquals(5382, obj1.id); assertEquals("Mary", obj1.name); Model obj2 = JSON.parseObject(jsonVal2, Model.class); assertEquals(2341, obj2.id); assertEquals("Bob", obj2.name);
8, JSONField jsonDirect
Dans la version fastjson-1.2.12, JSONField prend en charge un nouvel élément de configuration jsonDirect Son objectif est : lorsque vous avez un champ de type chaîne, il y a json. formater les données à l'intérieur. Vous souhaitez les saisir directement au lieu de les sortir après vous être échappé.
Modèle
import com.alibaba.fastjson.annotation.JSONField; public static class Model { public int id; @JSONField(jsonDirect=true) public String value; }
Usage
Model model = new Model(); model.id = 1001; model.value = "{}"; String json = JSON.toJSONString(model); Assert.assertEquals("{\"id\":1001,\"value\":{}}", json);