Heim > Artikel > Backend-Entwicklung > Umgang mit verschachteltem unstrukturiertem JSON in Go Lang
Der Umgang mit verschachteltem unstrukturiertem JSON in Go Lang ist eine wichtige Aufgabe. JSON (JavaScript Object Notation) ist ein häufig verwendetes Datenaustauschformat. Wenn JSON-Daten jedoch komplex verschachtelt sind, kann die Verarbeitung schwierig werden. Der PHP-Editor Yuzai stellt Ihnen einige Methoden und Techniken zur Verarbeitung von verschachteltem unstrukturiertem JSON in Go Lang vor, um Ihnen dabei zu helfen, diese Daten effizienter zu analysieren und zu verarbeiten. Wenn Sie diese Fähigkeiten beherrschen, können Sie problemlos mit komplexen JSON-Daten umgehen und so die Lesbarkeit und Wartbarkeit Ihres Codes verbessern.
Ich versuche zu verstehen, wie man aus unstrukturierten JSON-Daten in Golang auf bestimmte Daten zugreift. Ich habe den folgenden JSON und versuche, unter Material auf „foo1“ zuzugreifen, wenn foo1 andere Daten hat als foo2, das leer ist. Wenn ein Objekt wie „foo1“ Daten enthält, muss ich auch die Daten aus dem gleichnamigen taxonomischen Abschnitt lesen. Zum Beispiel. Da „foo1“ im Materialabschnitt Daten enthält, hätte ich den Methodenschlüsselwert unter „material->foo1“ und den desc von „category->foo1“ drucken sollen.
package main import ( "encoding/json" "fmt" ) type new struct { desc string `json:"desc"` } func main() { bjson := `{ "classifications": { "foo1": { "desc": "it may be possible.", "sol": "the backups.", "ref": { "sensitive information": "https://www.sensitive_information.html", "control sphere": "https://ww.example.org/data.html" },"bar1": { "desc": "the target", "sol": "should be used.", "ref": { "abc: srgery": "https://www.orp.org/" } }}, "material": { "backup file": [],"foo1": [ { "method": "get", "info": "it is not set", "level": 1, "parameter": "", "referer": "", "module": "diq", "curl_command": "curl \"https://example.com/\"", "wsg": [ "conf-12", "o-policy" ] }],"foo2": [],"bar1": []}, "anomalies": { "server error": [], "resource consumption": [] }, "additionals": { "web technology": [], "methods": [] }, "infos": { "url": "https://example.com/", "date": "thu, 08 dec 2022 06:52:04 +0000"}}}` var parseddata = make(map[string]map[string]new) json.unmarshal([]byte(bjson), &parseddata) fmt.println("output of parseddata - \n", parseddata["classifications"]["foo1"].desc) //for _, v := range parseddata["material"] { // fmt.println(v) //} }
Wenn foo1 nicht leer ist, erwartete Ausgabe:
Method is GET desc is It may be possible.
Sie können es in eine map[string]interface{}
-Variable entmarshalieren und dann eine Reihe von Typzusicherungen verwenden, um die gewünschten Informationen zu erhalten, wie zum Beispiel:
var parseddata = make(map[string]interface{}) json.unmarshal([]byte(bjson), &parseddata) fmt.printf("method is %s\n", parseddata["classifications"]. (map[string]interface{})["material"]. (map[string]interface{})["foo1"]. ([]interface{})[0]. (map[string]interface{})["method"].(string))
Das Obige wird ausgegeben:
method is get
Hier ist die vollständige, funktionierende Version des Codes:
package main import ( "encoding/json" "fmt" ) type new struct { desc string `json:"desc"` } func main() { bjson := `{ "classifications": { "foo1": { "desc": "it may be possible.", "sol": "the backups.", "ref": { "sensitive information": "https://www.sensitive_information.html", "control sphere": "https://ww.example.org/data.html" },"bar1": { "desc": "the target", "sol": "should be used.", "ref": { "abc: srgery": "https://www.orp.org/" } }}, "material": { "backup file": [],"foo1": [ { "method": "get", "info": "it is not set", "level": 1, "parameter": "", "referer": "", "module": "diq", "curl_command": "curl \"https://example.com/\"", "wsg": [ "conf-12", "o-policy" ] }],"foo2": [],"bar1": []}, "anomalies": { "server error": [], "resource consumption": [] }, "additionals": { "web technology": [], "methods": [] }, "infos": { "url": "https://example.com/", "date": "thu, 08 dec 2022 06:52:04 +0000"}}}` var parseddata = make(map[string]interface{}) json.unmarshal([]byte(bjson), &parseddata) fmt.printf("method is %s\n", parseddata["classifications"].(map[string]interface{})["material"].(map[string]interface{})["foo1"].([]interface{})[0].(map[string]interface{})["method"].(string)) }
Wenn ich das baue:
go build -o example main.go
So funktioniert es:
$ ./main method is get
Überprüfen Sie, ob der Wert nicht existiert oder eine leere Liste ist:
data := parsedData["classifications"].(map[string]interface{})["Material"].(map[string]interface{}) val, ok := data["foo2"] if !ok { panic("no key foo2 in map") } if count := len(val.([]interface{})); count == 0 { fmt.Printf("foo2 is empty\n") } else { fmt.Printf("foo2 has %d items", count) }
Das obige ist der detaillierte Inhalt vonUmgang mit verschachteltem unstrukturiertem JSON in Go Lang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!