Nazwy kluczy JSON pisane małymi literami z JSON Marshal in Go


175

Chcę użyć "encoding/json"pakietu do zorganizowania struktury zadeklarowanej w jednym z zaimportowanych pakietów mojej aplikacji.

Na przykład.:

type T struct {
    Foo int
}

Ponieważ jest importowany, wszystkie dostępne (eksportowane) pola w strukturze zaczynają się od dużej litery. Ale chciałbym mieć nazwy kluczy małymi literami:

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

spowoduje

{"Foo": 42}

ale chcę dostać

{"foo": 42}

Czy można w jakiś łatwy sposób obejść problem?


5
@Zippoxer: Powiedziałbym: klucz w protokole komunikacyjnym klient / serwer, który jest ściśle określony małymi literami. Cóż, w moim przypadku to nie ma znaczenia, ponieważ sam zdefiniowałem protokół… ale przynajmniej w teorii? Ale wiem, że to głównie ja poświęcam zbyt dużo czasu na głupiutki szczegół.
ANisus,

Nie przepraszaj. Nie jesteś głupi, język, który nie akceptuje pełnej specyfikacji json, jest głupi (chociaż problem można łatwo rozwiązać, jak poniżej).
Jehan

@ANisus: Źle odczytałem twoje pytanie dotyczące nazw kluczy struct, a nie nazw kluczy JSON. Głosowanie wycofane.
Flimzy

Odpowiedzi:


265

Zapoznaj się z dokumentacją dotyczącą kodowania / json.Marshal . Omawia użycie znaczników pola struct w celu określenia sposobu formatowania wygenerowanego pliku JSON.

Na przykład:

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

Spowoduje to wygenerowanie JSON w następujący sposób:

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

8
Tagi pól? O mój .. przegapiłem tę całą część podczas wyszukiwania w dokumentach. Szukałem flag, funkcji lub innych ustawień. Cóż, to jest dokładna odpowiedź, której szukałem! Poza tym mam nową koncepcję Go do poznania: tagi pól :)
ANisus

Są całkiem poręczne. Możesz uzyskać do nich dostęp w czasie wykonywania za pośrednictwem reflectpakietu.
jimt

Tak, pracując z refleksją widzę, że możliwość dodania metadanych do pola może być wspaniałą rzeczą! Przy okazji, właśnie spróbowałem odpowiedzi. Działa jak marzenie.
ANisus,

5
Właśnie zacząłem przeklinać język go - jakie to głupie, dlaczego mieliby robić pola z małymi literami w wygenerowanym formacie JSON itp., Itd. Potem natknąłem się na ten wątek i pomyślałem: „OMG To genialne !!!”. Skoczyłem nawet i wyjaśniłem swojej dziewczynie, dlaczego jestem taki podekscytowany: D To takie fajne :)))
nyxz

11
Upewnij się, że nie ma spacji między dwukropkiem a pierwszym cudzysłowem znacznika! Użyj json:"some_tag"zamiast json: "some_tag". Przez chwilę mnie to ugryzło.
David Morales,

8

Możesz stworzyć własną strukturę z kluczami, które chcesz wyeksportować, i nadać im odpowiednie tagi json dla nazw małych liter. Następnie możesz skopiować żądaną strukturę do swojej przed zakodowaniem jej jako JSON. Lub jeśli nie chcesz zawracać sobie głowy tworzeniem lokalnej struktury, prawdopodobnie możesz zrobić a map[string]interface{}i zakodować to.


Głupią rzeczą jest to, że drugi pakiet (zawierający typy) również jest mój. Ale tak, prawdopodobnie ślepo wpatrywałem się w fakt, że musi to być struktura. Użycie a map[string]interface{}zadziała, o ile nie skończę z zagnieżdżonymi obiektami / strukturami
ANisus

1
@ANisus: Och, moja odpowiedź była oparta na tym, że nie masz kontroli nad definicją struktury. Odpowiedź jimta jest zdecydowanie tym, czego chcesz.
Lily Ballard

Tak, nie byłem pewien, czy to był pakiet zewnętrzny, czy nie. Ale twoja odpowiedź jest nadal aktualna i przydatna w przypadkach, gdy nie masz kontroli nad definicjami.
ANisus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.