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

Umgang mit verschachteltem unstrukturiertem JSON in Go Lang

WBOY
WBOYnach vorne
2024-02-11 22:36:091023Durchsuche

在 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)
    //}
}

Wenn foo1 nicht leer ist, erwartete Ausgabe:

Method is GET
desc is It may be possible.

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))

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen