亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在golang中動態創建嵌套地圖

在golang中動態創建嵌套地圖

Go
慕姐8265434 2023-06-01 18:17:27
我正在嘗試在 Golang 中解釋 JSON。我正在搜索未知 JSON 中的特定屬性,我知道它的鍵,但我的 JSON 可能真的是嵌套的。我確實知道我的 JSON 中有多少“層”。例如,如果我的 JSON 是:nestedJson = { key1: { key2: { key3: "Found data" } } } 我的鍵是 ["key1", "key2", "key3"] 并且這個 JSON 中有 3 層,所以我可以通過這樣做來取回數據var nestedJson = []map[string]map[string]map[string]interface{}json.Unmarshal([]byte(nestedJon), &nestedJson)data := nestedJson["key1]["key2"]["key3"]我想要做的是通過為應該搜索的層數指定一個整數值來動態創建 nestedJson 對象。有人能幫忙嗎?如果我還不夠清楚,請告訴我!
查看完整描述

2 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

一般來說,對于這種情況,您必須json.Unmarshal使用interface{}.


b := []byte(`{ "key1": { "key2": { "key3": "Found data" } } } `)

var f interface{}

if err := json.Unmarshal(b, &f); err != nil {

    panic(err)

}

fmt.Println(f)

現在您可以使用一堆類型斷言來探索f,例如查找它包含哪些鍵:


m := f.(map[string]interface{})

for k, v := range m {

    if k == "key3" {

        fmt.Println("found key3. maps to", v)

    }

}

如果您在此級別找不到 key3,請使用遞歸檢查所有值 -它們是否與 key3 鍵映射,等等......類似


func findNested(m map[string]interface{}, s string) (bool, interface{}) {

    // Try to find key s at this level

    for k, v := range m {

        if k == s {

            return true, v

        }

    }

    // Not found on this level, so try to find it nested

    for _, v := range m {

        nm := v.(map[string]interface{})

        found, val := findNested(nm, s)

        if found {

            return found, val

        }

    }

    // Not found recursively

    return false, nil

}

注意:此功能很快被破解在一起,可能會錯誤處理一堆極端情況。它在這里展示了關鍵思想 - 將其用作滿足您特定需求的基礎


查看完整回答
反對 回復 2023-06-01
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

我個人喜歡使用gabs模塊,它可以以更人性化的方式處理這些情況。


要安裝模塊,請使用:

go?get?github.com/Jeffail/gabs/v2

方便的使用示例

// jsonParsed var contains a set of functions to play arround

jsonParsed, _ := gabs.ParseJSON([]byte(`{

? ? "outter":{

? ? ? ? "inner":{

? ? ? ? ? ? "value1":10,

? ? ? ? ? ? "value2":22

? ? ? ? },

? ? ? ? "alsoInner":{

? ? ? ? ? ? "value1":20,

? ? ? ? ? ? "array1":[

? ? ? ? ? ? ? ? 30, 40

? ? ? ? ? ? ]

? ? ? ? }

? ? }

}`))


// for your case, it's useful Exists or ExistsP functions

exists := jsonParsed.Exists("outter", "inner", "value1")

// exists == true


exists = jsonParsed.ExistsP("outter.inner.value3")

// exists == false

當您需要一些動態鍵搜索時,您可以使用 ChildrenMap 函數通過前面解釋的函數迭代和驗證鍵的存在。


jsonParsed, err := gabs.ParseJSON([]byte(`{"object":{"first":1,"second":2,"third":3}}`))

if err != nil {

? ? panic(err)

}


// S is shorthand for Search

for key, child := range jsonParsed.S("object").ChildrenMap() {

? ? fmt.Printf("key: %v, value: %v\n", key, child.Data().(float64))

? ? // here you can use Exists or ExistsP

}

// key: first, value: 1

// key: second, value: 2

// key: third, value: 3


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號