Nomi di chiavi JSON minuscole con JSON Marshal in Go


175

Desidero utilizzare il "encoding/json"pacchetto per eseguire il marshalling di una struttura dichiarata in uno dei pacchetti importati della mia applicazione.

Per esempio.:

type T struct {
    Foo int
}

Poiché viene importato, tutti i campi disponibili (esportati) nella struttura iniziano con una lettera maiuscola. Ma vorrei avere i nomi delle chiavi in ​​minuscolo:

out, err := json.Marshal(&T{Foo: 42})

si tradurrà in

{ "Foo": 42}

ma vorrei ottenere

{ "Pippo": 42}

È possibile aggirare il problema in qualche modo semplice?


5
@Zippoxer: direi: una chiave in un protocollo di comunicazione client / server strettamente definito con lettere minuscole. Bene, nel mio caso non importa da quando ho definito il protocollo da solo .. ma almeno in teoria? Ma so che sono solo io a passare troppo tempo su un piccolo dettaglio stupido.
ANisus,

Non scusarti. Non sei quello sciocco, il linguaggio che non accetta le specifiche json complete è quello sciocco (anche se il problema è facilmente risolto, come di seguito).
Jehan,

@ANisus: ho letto male la tua domanda sui nomi delle chiavi struct, non sui nomi delle chiavi JSON. Ritiro del voto.
Flimzy,

Risposte:


266

Dai un'occhiata ai documenti per encoding / json.Marshal . Discute l'utilizzo dei tag del campo struct per determinare la formattazione del json generato.

Per esempio:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

Questo genererà JSON come segue:

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
Tag di campo? Oh mio .. Mi è mancata questa intera parte durante la ricerca nei documenti. Stavo cercando bandiere, funzioni o altre impostazioni. Bene, questa è la risposta esatta che stavo cercando! Inoltre, ho un nuovo concetto Go da conoscere: tag di campo :)
ANisus

Sono abbastanza utili. È possibile accedervi in ​​fase di esecuzione tramite il reflectpacchetto.
jimt

Sì, quando lavoro con la riflessione vedo come avere un modo per aggiungere metadati a un campo possa essere una cosa meravigliosa! A proposito, ho appena provato la risposta. Funziona come un fascino.
ANiso

5
Ho appena iniziato a maledire il linguaggio go - quanto è stupido, perché dovrebbero rendere i campi con lettere minuscole nel JSON generato ecc, ecc. Poi mi sono imbattuto in questo thread e ho pensato "OMG È geniale !!!". Ho anche saltato e spiegato alla mia ragazza perché sono così eccitato: D È così bello :)))
nyxz,

11
Assicurati che non ci sia spazio tra i due punti e la prima virgoletta del tag! Usa json:"some_tag"invece di json: "some_tag". Mi sono morso per un po '.
David Morales,

8

È possibile creare la propria struttura con le chiavi che si desidera esportare e fornire loro i tag json appropriati per i nomi minuscoli. Quindi è possibile copiare la struttura desiderata nella propria prima di codificarla come JSON. O se non vuoi preoccuparti di creare una struttura locale, probabilmente potresti crearne una map[string]interface{}e codificarla.


La cosa sciocca è che l'altro pacchetto (contenente i tipi) è in realtà anche il mio. Ma sì, probabilmente ho fissato ciecamente il fatto che doveva essere una struttura. L'uso di a map[string]interface{}funzionerebbe fino a quando non
finirò

1
@ANisus: Oh, la mia risposta era basata sul fatto che tu non avessi il controllo della definizione della struttura. La risposta di Jim è sicuramente quello che vuoi.
Lily Ballard,

Sì, non ero chiaro se fosse o meno un pacchetto esterno. Ma la tua risposta è ancora pertinente e utile nei casi in cui non controlli le definizioni.
ANiso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.