Istnieją a kilka pytań na temat , ale żaden z nich nie wydają się pokrywać moim przypadku, więc tworzę nowy.
Mam JSON jak poniżej:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
Czy istnieje sposób, aby cofnąć zagnieżdżoną właściwość bar i przypisać ją bezpośrednio do właściwości struct bez tworzenia zagnieżdżonej struktury?
Rozwiązanie, które teraz stosuję, jest następujące:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
To jest wersja uproszczona, zignoruj szczegółowość. Jak widać, chciałbym móc przeanalizować i przypisać wartość
// FooBar string `json:"foo.bar"`
Widziałem ludzi używających mapy, ale to nie moja sprawa. W zasadzie nie obchodzi mnie zawartość foo
(który jest dużym obiektem), z wyjątkiem kilku konkretnych elementów.
Jakie jest prawidłowe podejście w tym przypadku? Nie szukam dziwnych hacków, więc jeśli tak jest, nie mam z tym problemu.
Tak jak wspomniał Volker, najlepszym rozwiązaniem są struktury zagnieżdżone. Ale jeśli naprawdę nie chcesz zagnieżdżonych struktur, możesz nadpisać funkcję UnmarshalJSON.
https://play.golang.org/p/dqn5UdqFfJt
Proszę zignorować fakt, że nie zwracam właściwego błędu. Pominąłem to dla uproszczenia.
UPDATE: Prawidłowe pobieranie „większej” wartości.
źródło
To jest przykład tego, jak usunąć odpowiedzi JSON z serwera proxy sbserver Safebrowsing v4 API: https://play.golang.org/p/4rGB5da0Lt
źródło
Tak. Dzięki gjson wszystko, co musisz teraz zrobić, to:
bar := gjson.Get(json, "foo.bar")
bar
jeśli chcesz, może to być właściwość struct. Nie ma też map.źródło
fastjson.GetString(json, "foo", "bar")
A co z anonimowymi polami? Nie jestem pewien, czy będzie to stanowić „zagnieżdżoną strukturę”, ale jest to czystsze niż deklaracja zagnieżdżonej struktury. A co jeśli chcesz ponownie użyć zagnieżdżonego elementu w innym miejscu?
źródło
Przypisz wartości zagnieżdżone
json
do struct, dopóki nie poznasz podstawowego typu kluczy JSON: -źródło
Pracowałem nad czymś takim. Ale działa tylko ze strukturami wygenerowanymi z proto. https://github.com/flowup-labs/grpc-utils
w twoim proto
Wtedy twoje wyjście będzie
źródło
Połączenie map i struct umożliwia usuwanie zagnieżdżonych obiektów JSON, w których klucz jest dynamiczny. => mapa [ciąg]
Na przykład: stock.json
Aplikacja Go
Klucz dynamiczny w skrócie obsługuje ciąg, a zagnieżdżony obiekt jest reprezentowany przez strukturę.
źródło