Heim > Backend-Entwicklung > Golang > Umgang mit verschachteltem unstrukturiertem JSON in Go Lang

Umgang mit verschachteltem unstrukturiertem JSON in Go Lang

WBOY
Freigeben: 2024-02-11 22:36:09
nach vorne
1046 Leute haben es durchsucht

在 Go Lang 中处理嵌套非结构化 JSON

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.

Frageninhalt

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)
    //}
}
Nach dem Login kopieren

Wenn foo1 nicht leer ist, erwartete Ausgabe:

Method is GET
desc is It may be possible.
Nach dem Login kopieren

Workaround

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))
Nach dem Login kopieren

Das Obige wird ausgegeben:

method is get
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

Wenn ich das baue:

go build -o example main.go
Nach dem Login kopieren

So funktioniert es:

$ ./main
method is get
Nach dem Login kopieren

Ü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)
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage