Es gibt ein paar Fragen zu diesem Thema, aber keine scheint meinen Fall abzudecken, daher erstelle ich eine neue.
Ich habe JSON wie folgt:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
Gibt es eine Möglichkeit, die Eigenschaft der verschachtelten Leiste zu entfernen und sie direkt einer Struktureigenschaft zuzuweisen, ohne eine verschachtelte Struktur zu erstellen?
Die Lösung, die ich gerade übernehme, ist die folgende:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
Dies ist eine vereinfachte Version, bitte ignorieren Sie die Ausführlichkeit. Wie Sie sehen, möchte ich den Wert analysieren und zuweisen können
// FooBar string `json:"foo.bar"`
Ich habe Leute gesehen, die eine Karte benutzt haben, aber das ist nicht mein Fall. Der Inhalt von foo
(bei dem es sich um ein großes Objekt handelt) ist mir im Grunde genommen egal , mit Ausnahme einiger spezifischer Elemente.
Was ist in diesem Fall der richtige Ansatz? Ich bin nicht auf der Suche nach seltsamen Hacks. Wenn dies der richtige Weg ist, bin ich damit einverstanden.
Wie Volker bereits erwähnt hat, sind verschachtelte Strukturen der richtige Weg. Wenn Sie jedoch wirklich keine verschachtelten Strukturen möchten, können Sie die UnmarshalJSON-Funktion überschreiben.
https://play.golang.org/p/dqn5UdqFfJt
Bitte ignorieren Sie die Tatsache, dass ich keinen richtigen Fehler zurücksende. Ich habe das der Einfachheit halber weggelassen.
UPDATE: Richtiges Abrufen des Werts "more".
quelle
Dies ist ein Beispiel für das Aufheben der Bereitstellung von JSON-Antworten vom Safebrowsing v4-API-sbserver-Proxyserver: https://play.golang.org/p/4rGB5da0Lt
quelle
Ja. Mit gjson müssen Sie jetzt nur noch Folgendes tun:
bar := gjson.Get(json, "foo.bar")
bar
könnte eine struct-Eigenschaft sein, wenn Sie möchten. Auch keine Karten.quelle
fastjson.GetString(json, "foo", "bar")
Was ist mit anonymen Feldern? Ich bin nicht sicher, ob dies eine "verschachtelte Struktur" darstellt, aber es ist sauberer als eine verschachtelte Strukturdeklaration. Was ist, wenn Sie das verschachtelte Element an anderer Stelle wiederverwenden möchten?
quelle
Weisen
json
Sie struct die Werte von verschachtelt zu, bis Sie den zugrunde liegenden Typ der JSON-Schlüssel kennen: -quelle
Ich habe an so etwas gearbeitet. Arbeitet aber nur mit Strukturen, die aus Proto generiert wurden. https://github.com/flowup-labs/grpc-utils
in deinem Proto
Dann wird Ihre Ausgabe sein
quelle
Durch die Kombination von Map und Struct können Sie verschachtelte JSON-Objekte aufheben, bei denen der Schlüssel dynamisch ist. => map [string]
Zum Beispiel: stock.json
Gehen Sie zur Anwendung
Der dynamische Schlüssel im Hash behandelt eine Zeichenfolge, und das verschachtelte Objekt wird durch eine Struktur dargestellt.
quelle