Maison  >  Article  >  Java  >  Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java

Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java

王林
王林avant
2023-04-18 15:28:031723parcourir

Objet Java en Json, renommage et commande du champ d'objet @JSONField

1 Présentation de la dépendance maven

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.66</version>
        </dependency>

2. Renommer le champ

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

3. Tri des champs

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 champs​​de sérialisation et de désérialisation par défaut ;

Scénarios d'utilisation courants de l'annotation @JSONField

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;

1. Contenu JSON et classe d'entité, méthode d'écriture régulière de @JSONField

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

2. La conversion de chaîne de caractères JSON correspond à l'objet Java

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

Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java

3 Prise en charge de la sérialisation et de la désérialisation

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)

4. Spécifiez l'ordre des champs

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


Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java

Le résultat courant après l'ajout du paramètre ordinal

Comment résoudre le problème du renommage et de l'ordre des champs d'objet @JSONField en Java

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer