Maison >Java >javaDidacticiel >Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.66</version> </dependency>
1 Créez une entité de test
import lombok.Data; import java.io.Serializable; /** * @类名 WeChatBusinessLicenseInfo * @描述 营业执照/登记证书信息(测试用) * @版本 1.0 * @创建人 XuKang * @创建时间 2021/12/24 10:43 **/ @Data public class LkWeChatBusinessLicenseInfo implements Serializable { private static final long serialVersionUID = 1582941630439552458L; private String businessLicenseCopy; private String businessLicenseNumber; private String merchantName; private String legalPerson; private String companyAddress; private String businessTime; public LkWeChatBusinessLicenseInfo(){ this.businessLicenseCopy = "1"; this.businessLicenseNumber = "2"; this.merchantName = "3"; this.legalPerson = "4"; this.companyAddress = "5"; this.businessTime = "6"; } }
2. l'effet avant la conversion
System.out.println(JSONObject.toJSONString(new LkWeChatBusinessLicenseInfo()));
{
"businessLicenseCopy":"1",
"businessLicenseNumber":"2",
"businessTime":"6",
"companyAddress":"5",
" legalPerson": "4",
"merchantName": "3"
}
3. Nous devons convertir en une clé soulignée, par exemple en convertissant businessLicenseCopy en business_license_copy
Nous devons modifier l'entité et ajouter l'annotation @JSONField
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import java.io.Serializable; /** * @类名 WeChatBusinessLicenseInfo * @描述 营业执照/登记证书信息(测试用) * @版本 1.0 * @创建人 XuKang * @创建时间 2021/12/24 10:43 **/ @Data public class LkWeChatBusinessLicenseInfo implements Serializable { private static final long serialVersionUID = 1582941630439552458L; @JSONField(name = "business_license_copy") private String businessLicenseCopy; @JSONField(name = "business_license_number") private String businessLicenseNumber; @JSONField(name = "merchant_name") private String merchantName; @JSONField(name = "legal_person") private String legalPerson; @JSONField(name = "company_address") private String companyAddress; @JSONField(name = "business_time") private String businessTime; public LkWeChatBusinessLicenseInfo(){ this.businessLicenseCopy = "1"; this.businessLicenseNumber = "2"; this.merchantName = "3"; this.legalPerson = "4"; this.companyAddress = "5"; this.businessTime = "6"; } }
4. Ajoutez des annotations et imprimez le json
System.out.println(JSONObject.toJSONString(new LkWeChatBusinessLicenseInfo()));
{
"business_license_copy":"1",
"business_license_number":"2",
"business_time":"6",
"company_address": "5" ,
"legal_person":"4",
"merchant_name":"3"
}
1. Le json que nous produisons et imprimons est comme ceci
{
"business_license_copy" :" 1",
"business_license_number": "2",
"business_time": "6",
"company_address": "5",
"legal_person": "4",
"merchant_name": "3"
}
Nous voulons réorganiser les clés dans un certain ordre
2. Ajoutez l'ordinal de tri à l'annotation @JSONField
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import java.io.Serializable; /** * @类名 WeChatBusinessLicenseInfo * @描述 营业执照/登记证书信息(测试用) * @版本 1.0 * @创建人 XuKang * @创建时间 2021/12/24 10:43 **/ @Data public class LkWeChatBusinessLicenseInfo implements Serializable { private static final long serialVersionUID = 1582941630439552458L; @JSONField(name = "business_license_copy",ordinal = 1) private String businessLicenseCopy; @JSONField(name = "business_license_number",ordinal = 2) private String businessLicenseNumber; @JSONField(name = "merchant_name",ordinal = 3) private String merchantName; @JSONField(name = "legal_person",ordinal = 4) private String legalPerson; @JSONField(name = "company_address",ordinal = 5) private String companyAddress; @JSONField(name = "business_time",ordinal = 6) private String businessTime; public LkWeChatBusinessLicenseInfo(){ this.businessLicenseCopy = "1"; this.businessLicenseNumber = "2"; this.merchantName = "3"; this.legalPerson = "4"; this.companyAddress = "5"; this.businessTime = "6"; } }
3. Sortie et imprimez les entités converties :
System.out.println(JSONObject.toJSONString( new LkWeChatBusinessLicenseInfo()));
{
"business_license_copy":"1",
"business_license_number":"2",
"merchant_name":"3",
"legal_person":"4",
"company_address": "5",
"business_time":"6"
}
Résumé : En plus de @JSONField, il existe également @JsonProperty et @SerializedName qui est principalement utilisé pour la conversion des paramètres d'entrée et la sérialisation des chaînes Json ; Objets Java ; @SerializedName modifie les valeurs des champsde sérialisation et de désérialisation par défaut ;
Scénarios d'application :
Lorsque nous interagissons avec le front-end, le front- end veut Le nom du champ requis est différent du nom du champ que nous fournissons.Une solution pour le moment consiste à modifier la classe d'entité. Cependant, si la classe d'entité est utilisée plus souvent, le coût de sa modification sera trop élevé. , vous pouvez utiliser l'annotation @JSONField pour réaliser le remplacement. L'effet et l'utilisation sont les suivants :
@JSONField(name = "size_new") private int size;
JSON (cohérent avec le contenu de la chaîne JSON suivante)
{ size: 5, weight: 10, colour: "red" }
Classe d'entité (AppleDO.java)
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.annotation.JSONField; public class AppleDO { @JSONField(name = "size_new") private int size; @JSONField(name = "weight_new") private int weight; @JSONField(name = "colour_new") private String colour; public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public String getColour() { return colour; } public void setColour(String colour) { this.colour = colour; } }
Code d'exécution
public static void main(String[] args) { String json = "{\n" + " size_new: 5,\n" + " weight_new: 10,\n" + " colour_new: \"red\",\n" + "}"; AppleDO appleDO = JSON.parseObject(json, AppleDO.class); System.out.println(appleDO.getSize()); System.out.println(appleDO.getWeight()); System.out.println(appleDO.getColour()); }
Résultat d'exécution
Les valeurs par défaut. de sérialisation et de désérialisation dans le code source sont tous deux vrais, alors par défaut Ce champ peut être sérialisé et désérialisé comme suit :
boolean serialize() default true; boolean deserialize() default true;
Méthode d'utilisation (ce qui suit ne prend pas en charge la sérialisation, mais prend en charge la désérialisation)
@JSONField(name = "size_new", serialize = false, deserialize = true) private int size;
Lorsque certains des nos champs ont des valeurs nulles, nous souhaitons toujours utiliser ce champ Retour au front-end (cette configuration peut renvoyer une chaîne avec des champs vides, mais elle n'est pas valide lorsque le champ est un type de données de base et doit être converti en une classe wrapper)
@JSONField(serialzeFeatures= SerializerFeature.WriteMapNullValue)
Convertissez les objets Java au format JSON, l'ordre des champs convertis sera trié selon la première lettre. Vous pouvez également spécifier l'ordre des champs de la manière suivante :
@JSONField(name = "size_new", ordinal = 3) private int size; @JSONField(name = "weight_new", ordinal = 1) private int weight; @JSONField(name = "colour_new", ordinal = 2) private String colour;
Exécutez le code
.AppleDO apple = new AppleDO(); apple.setSize(6); apple.setWeight(12); apple.setColour("green"); String appleStr = JSON.toJSONString(apple); System.out.println(appleStr);
Le résultat courant avant d'ajouter le paramètre ordinal
Le résultat courant après l'ajout du paramètre ordinal
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!