Получить значения из структуры json
Полученные данные, структура которых json, вношу в переменную s.
package main
import (
"encoding/json"
"fmt"
)
var s = `{
"abc": {
"a": {
"x": {"p": "val"},
"y": {"p": "msg", "b": 33.5, "ms": 0},
"z": {"p": "msg ", "b": -12, "ms": 0}
},
"b": ["x", "y", "z"],
"c": [
[69, "text_05", "m n o"],
[4, " text_02", "def"],
[1, "text_01", "abc "],
[48, " text_04 ", "jkl"],
[5, " text_03 ", " ghi"],
[82, "text_06 ", " pq r "]
]
},
"xyz": {
"z": [
[11, "aaa"],
[33, "bbb"]
]
}}`
func main() {
var f map[string]interface{}
if err := json.Unmarshal([]byte(s), &f); err != nil {
fmt.Println(err)
}
d := []string{}
for key := range f {
d = append(d, key)
}
fmt.Println(len(d)) // 2
fmt.Println(d) // [abc xyz]
for j := 0; j < len(d); j++ {
// ...
}
}
Как получить все ключи и значения данной структуры. Получил ключи abc и xyz. Как пройтись по ключам: a, x, y, z, p, b, c и их значениям?
Ответы (2 шт):
Автор решения: Антон
→ Ссылка
abc_a := f["abc"].(map[string]interface{})["a"]
fmt.Println(abc_a)
abc_a_z := abc_a.(map[string]interface{})["z"]
fmt.Println(abc_a_z)
Автор решения: Pak Uula
→ Ссылка
Ваша задача решается рекурсивным обходом по мапам и массивам.
func GetMapKeysRecursive(m map[string]any) []string {
result := []string{}
for k, v := range m {
result = append(result, k)
result = append(result, GetKeysRecursive(v)...)
}
return result
}
func GetArrayKeysRecursive(a []any) []string {
result := []string{}
for _, v := range a {
result = append(result, GetKeysRecursive(v)...)
}
return result
}
func GetKeysRecursive(a any) []string {
switch a.(type) {
case map[string]any:
return GetMapKeysRecursive(a.(map[string]any))
case []any:
return GetArrayKeysRecursive(a.([]any))
default:
return []string{}
}
}
Полный пример здесь: https://go.dev/play/p/B002DHUb7WF
Обратите внимание, в нём я немного изменил ваш json, поменял в массиве xyz.z один объект, чтобы показать что обходчик заходит внутрь массивов.
Также обратите внимание, что порядок выдачи ключей отличается от порядка ключей в документе json, так как мапы в golang неупорядочены.