Maison >développement back-end >Golang >Changer dynamiquement la clé JSON lors du marshaling et du démarshaling

Changer dynamiquement la clé JSON lors du marshaling et du démarshaling

WBOY
WBOYavant
2024-02-11 09:30:091230parcourir

marshal 和 unmarshal 时动态更改 json key

L'éditeur php Xiaoxin vous présentera une méthode pour modifier dynamiquement les valeurs des clés JSON pendant les processus Marshal et Unmarshal. Lors du traitement des données JSON, nous devons parfois modifier ou remplacer les valeurs clés. Cet article partagera une astuce simple mais efficace pour aider les développeurs à atteindre cet objectif en PHP. En utilisant certaines fonctions et technologies spécifiques, nous pouvons facilement opérer sur les données JSON et répondre au besoin de modifier dynamiquement les valeurs clés. Ensuite, suivez l'éditeur pour apprendre cette technique pratique !

Contenu de la question

Je suis obligé d'utiliser une API qui possède deux clés ou identifiants différents pour un même objet (numéro de TVA). Cela dépend si l'appel est GET ou POST/PATCH

Dans GET, je dois désorganiser/décoder le json en utilisant cette structure :

type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat"` // here
}

Dans POST et PATCH, je peux rassembler les données en json en utilisant cette structure :

<code>type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat_identifier"` // here
}
</code>

La solution évidente est d'avoir deux structures "différentes" avec le même contenu mais des clés JSON légèrement différentes, et deux fonctions de conversion. Ou avoir deux champs différents dans la structure : Vat et VatIndentifier.

Le problème est que cela ajoute une complexité supplémentaire à un code déjà complexe.

Alors je veux savoir :

Existe-t-il un moyen (semblable à la réflexion) de changer la clé JSON du champ TVA dans la structure en fonction de la situation ?

Solution de contournement

Vous ne pouvez pas modifier les définitions de type au moment de l'exécution, y compris les balises struct.

Tant que les types et l'ordre des champs (c'est-à-dire la disposition de la mémoire) sont les mêmes, aucune fonction de conversion n'est nécessaire, ils peuvent être convertis directement : https://go.dev/play/p/IhkVM- BMLiY

func main() {
    foo := SilverfinCompanyFoo{
        ID:   1,
        Name: "Baz",
        Vat:  "Qux",
    }

    bar := SilverfinCompanyBar(foo)
    fmt.Println(bar)
}

type SilverfinCompanyFoo struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat"` // here
}

type SilverfinCompanyBar struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat_identifier"` // here
}

// {1 Baz Qux}

Il s'agit d'une solution courante pour ce type de scénario.

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
Article précédent:Ensemble SQL dynamique GolangArticle suivant:Ensemble SQL dynamique Golang