foo1 dan desc dari category->foo1. packagemainimport("pengekodan/json""fmt"/> foo1 dan desc dari category->foo1. packagemainimport("pengekodan/json""fmt">

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

Mengendalikan JSON tidak berstruktur bersarang dalam Go Lang

WBOY
WBOYke hadapan
2024-02-11 22:36:091032semak imbas

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

Jika foo1 tidak kosong, output dijangka:

Method is GET
desc is It may be possible.

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

Di atas akan mengeluarkan:

method is get

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

Jika saya membina ini:

go build -o example main.go

Begini cara ia berfungsi:

$ ./main
method is get

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam