Rumah > pembangunan bahagian belakang > Golang > Mengendalikan JSON tidak berstruktur bersarang dalam Go Lang

Mengendalikan JSON tidak berstruktur bersarang dalam Go Lang

WBOY
Lepaskan: 2024-02-11 22:36:09
ke hadapan
1045 orang telah melayarinya

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

Mengendalikan JSON tidak berstruktur bersarang dalam Go Lang ialah tugas yang kritikal. JSON (JavaScript Object Notation) ialah format pertukaran data yang biasa digunakan, tetapi apabila data JSON disusun secara kompleks, ia mungkin menjadi sukar untuk diproses. Editor PHP Yuzai akan memperkenalkan anda kepada beberapa kaedah dan teknik untuk memproses JSON tidak berstruktur bersarang dalam Go Lang untuk membantu anda menghuraikan dan mengendalikan data ini dengan lebih cekap. Dengan menguasai kemahiran ini, anda akan dapat mengendalikan data JSON yang kompleks dengan mudah dan meningkatkan kebolehbacaan dan kebolehselenggaraan kod anda.

Kandungan soalan

Saya cuba memahami cara mengakses data tertentu daripada data json tidak berstruktur dalam golang. Saya mempunyai json berikut dan saya cuba mengakses "foo1" di bawah bahan apabila foo1 mempunyai beberapa data yang berbeza daripada foo2 yang kosong. Apabila objek seperti foo1 mempunyai data, saya juga perlu membaca data dari bahagian taksonomi dengan nama yang sama. Contohnya. Memandangkan foo1 di bawah bahagian bahan mempunyai data, saya sepatutnya mencetak nilai kunci kaedah di bawah material->foo1 dan desc dari category->foo1.

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)
    //}
}
Salin selepas log masuk

Jika foo1 tidak kosong, output dijangka:

Method is GET
desc is It may be possible.
Salin selepas log masuk

Penyelesaian

Anda boleh membongkarnya menjadi pembolehubah map[string]interface{} dan kemudian menggunakan satu siri penegasan jenis untuk mendapatkan maklumat yang anda inginkan, seperti:

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))
Salin selepas log masuk

Di atas akan mengeluarkan:

method is get
Salin selepas log masuk

Berikut ialah versi lengkap kod yang berfungsi:

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))
}
Salin selepas log masuk

Jika saya membina ini:

go build -o example main.go
Salin selepas log masuk

Begini cara ia berfungsi:

$ ./main
method is get
Salin selepas log masuk

Semak jika nilai tidak wujud atau senarai kosong:

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)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengendalikan JSON tidak berstruktur bersarang dalam Go Lang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan