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

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
- 2 回答
- 0 關注
- 155 瀏覽
添加回答
舉報