Heim >Backend-Entwicklung >Golang >Wie konvertiere ich Snake-Case-Schlüssel in Go JSON in Camel Case?

Wie konvertiere ich Snake-Case-Schlüssel in Go JSON in Camel Case?

DDD
DDDOriginal
2024-10-28 12:07:01836Durchsuche

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

Konvertieren von Snake Case-Schlüsseln in JSON in Camel Case in Go

Frage:

In Gehen Sie, wie können wir Snake_Case-Schlüssel in einem JSON rekursiv in CamelCase-Schlüssel konvertieren? Dies ist besonders relevant für die Ausrichtung von API-Antwort-JSON an interne Standards beim Empfang von Daten aus einem Datenspeicher wie Elasticsearch, wo die Schlüsselformate variieren können.

Antwort:

Um dies zu erreichen Bei der Konvertierung können wir mehrere Ansätze nutzen. Eine effektive Methode nutzt die Funktion von Go 1.8, zwei Strukturen mit unterschiedlichen Feld-Tags zu definieren. Durch die sorgfältige Erstellung der Tags können wir mühelos zwischen den beiden Strukturen konvertieren und so die gewünschte Schlüsselkonvertierung effektiv anwenden.

Codebeispiel für die Verwendung von Tags:

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

Rekursiver kartenbasierter Ansatz:

Eine weitere umfassende Strategie besteht darin, zu versuchen, das JSON-Dokument in eine Karte zu entpacken. Wenn die Operation erfolgreich ist, können wir die Schlüssel methodisch korrigieren und die Schlüsselkonvertierungsfunktion für jeden Kartenwert rekursiv ausführen. Das folgende Beispiel zeigt, wie alle Schlüssel in Großbuchstaben umgewandelt werden. Die fixKey-Funktion sollte in Ihrer Implementierung durch eine Snake_case-Konvertierungsfunktion ersetzt werden.

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

Das obige ist der detaillierte Inhalt vonWie konvertiere ich Snake-Case-Schlüssel in Go JSON in Camel Case?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn