我有一个http服务器,我想处理JSON响应以覆盖JSON文件,我希望能够解析任何数量的数据和结构。
所以我的JSON数据看起来像这样:
{
"property1": "value",
"properties": {
"property1": 1,
"property2": "value"
}
}
或者看起来像这样:
{"property": "value"}
我想遍历每个属性,如果它已经存在于JSON文件中,则覆盖它的值,否则将其附加到JSON文件。
我尝试过使用map
,但它似乎不支持索引。我可以使用map["property"]
搜索特定属性,但我的想法是我还不知道任何JSON数据。
我如何(不知道结构)迭代每个属性并打印其属性名称和值?
答案 0 :(得分:0)
我如何(不知道结构)遍历每个属性并打印其属性名称和值?
这是一个基本函数,它通过解析的json数据结构进行递归并打印键/值。它没有经过优化,可能无法解决所有边缘情况(如数组中的数组),但您明白了。 Playground
给定像{"someNumerical":42.42,"stringsInAnArray":["a","b"]}
之类的对象,输出类似于以下内容:
object {
key: someNumerical value: 42.42
key: stringsInAnArray value: array [
value: a
value: b
]
value: [a b]
}
代码:
func RecurseJsonMap(dat map[string]interface{}) {
fmt.Println("object {")
for key, value := range dat {
fmt.Print("key: " + key + " ")
// print array properties
arr, ok := value.([]interface{})
if ok {
fmt.Println("value: array [")
for _, arrVal := range arr {
// recurse subobjects in the array
subobj, ok := arrVal.(map[string]interface{})
if ok {
RecurseJsonMap(subobj)
} else {
// print other values
fmt.Printf("value: %+v\n", arrVal)
}
}
fmt.Println("]")
}
// recurse subobjects
subobj, ok := value.(map[string]interface{})
if ok {
RecurseJsonMap(subobj)
} else {
// print other values
fmt.Printf("value: %+v\n" ,value)
}
}
fmt.Println("}")
}
func main() {
// some random json object in a string
byt := []byte(`{"someNumerical":42.42,"stringsInAnArray":["a","b"]}`)
// we are parsing it in a generic fashion
var dat map[string]interface{}
if err := json.Unmarshal(byt, &dat); err != nil {
panic(err)
}
RecurseJsonMap(dat)
}