首頁 >後端開發 >Golang >如何使用 json.Unmarshal 有效解析 Go 中的複雜 JSON 結構?

如何使用 json.Unmarshal 有效解析 Go 中的複雜 JSON 結構?

Barbara Streisand
Barbara Streisand原創
2025-01-03 13:41:43839瀏覽

How to Effectively Parse Complex JSON Structures in Go Using `json.Unmarshal`?

如何使用Go Unmarshal 解析複雜的JSON:揭示內部工作原理

Go 簡化的encoding/json 包提供了json.Unmarshal JSON 解析任務的函數。然而,遇到複雜的 JSON 結構可能具有挑戰性。

解碼為介面{}

對於未知的 JSON 數據,可以使用 Unmarshal 將其解碼為介面{} 。這種方法會產生一個 map[string]interface{} 值,其中鍵是字串,值是 interface{} 類型。

例如,考慮以下JSON:

{
     "k1" : "v1", 
     "k2" : "v2", 
     "k3" : 10, 
     "result" : [
                 [
                 ["v4", v5, {"k11" : "v11", "k22" : "v22"}]
                 , ... , 
                 ["v4", v5, {"k33" : "v33", "k44" : "v44"}
                 ]
                 ], 
                 "v3"
                ] 
}

Go解碼和存取此資料的程式碼:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    b := []byte(`{
       "k1" : "v1", 
       "k3" : 10,
       result:["v4",12.3,{"k11" : "v11", "k22" : "v22"}]
    }`)
    var f interface{}
    err := json.Unmarshal(b, &f)
    if err != nil {
        fmt.Println(err)
        return
    }
    m := f.(map[string]interface{})
    for k, v := range m {
        switch vv := v.(type) {
        case string:
            fmt.Println(k, "is string", vv)
        case int:
            fmt.Println(k, "is int", vv)
        case []interface{}:
            fmt.Println(k, "is an array:")
            for i, u := range vv {
                fmt.Println(i, u)
            }
        default:
            fmt.Println(k, "is of a type I don't know how to handle")
        }
    }
}

透過斷言介面類型並利用類型開關,可以導航

以上是如何使用 json.Unmarshal 有效解析 Go 中的複雜 JSON 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn