Maison >développement back-end >Golang >Comment convertir les clés Snake Case en Camel Case dans Go JSON ?

Comment convertir les clés Snake Case en Camel Case dans Go JSON ?

DDD
DDDoriginal
2024-10-28 12:07:01831parcourir

How to Convert Snake Case Keys to Camel Case in Go JSON?

Conversion des clés Snake Case en JSON en Camel Case dans Go

Question :

Dans Allez, comment pouvons-nous convertir les clés Snake_case dans un JSON en clés CamelCase de manière récursive ? Ceci est particulièrement pertinent pour aligner la réponse API JSON sur les normes internes tout en recevant des données d'un magasin de données comme Elasticsearch, où les formats de clés peuvent varier.

Réponse :

Pour y parvenir conversion, nous pouvons exploiter plusieurs approches. Une méthode efficace utilise la fonctionnalité de Go 1.8 consistant à définir deux structures avec des balises de champ distinctes. En élaborant soigneusement les balises, nous pouvons facilement convertir entre les deux structures, en appliquant efficacement la conversion de clé souhaitée.

Exemple de code utilisant des balises :

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type ESModel struct {
    AB string `json:"a_b"`
}

type APIModel struct {
    AB string `json:"aB"`
}

func main() {
    b := []byte(`{
            "a_b": "c"
    }`)

    var x ESModel
    json.Unmarshal(b, &x)

    b, _ = json.MarshalIndent(APIModel(x), "", "  ")
    fmt.Println(string(b))
}</code>

Approche récursive basée sur une carte :

Une autre stratégie globale consiste à tenter de désorganiser le document JSON dans une carte. Si l'opération réussit, nous pouvons corriger méthodiquement les clés et exécuter récursivement la fonction de conversion de clé pour chaque valeur de carte. L'exemple suivant illustre comment convertir toutes les clés en majuscules. La fonction fixKey doit être remplacée par une fonction de conversion Snake_case dans votre implémentation.

<code class="go">package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "strings"
)

func main() {
    // Document source as returned by Elasticsearch
    b := json.RawMessage(`{
            "a_b": "c",
            "d_e": ["d"],
            "e_f": {
                    "g_h": {
                            "i_j": "k",
                            "l_m": {}
                    }
            }
    }`)

    x := convertKeys(b)

    buf := &bytes.Buffer{}
    json.Indent(buf, []byte(x), "", "  ")
    fmt.Println(buf.String())
}

func convertKeys(j json.RawMessage) json.RawMessage {
    m := make(map[string]json.RawMessage)
    if err := json.Unmarshal([]byte(j), &m); err != nil {
            // Not a JSON object
            return j
    }

    for k, v := range m {
            fixed := fixKey(k)
            delete(m, k)
            m[fixed] = convertKeys(v)
    }

    b, err := json.Marshal(m)
    if err != nil {
            return j
    }

    return json.RawMessage(b)
}

func fixKey(key string) string {
    return strings.ToUpper(key)
}</code>

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn