有一种简单的方法可以创建一些数据结构的值,您知道要生成/复制的 JSON 输出:
获取您要生成的输出,并将其解组为map[string]interface{}
. 您将获得一个映射值,当您编组时将产生您想要的输出。当您解组预期输出时,您可以检查结果映射值以了解您需要创建什么才能获得预期输出。
这也适用于您的情况。这是代码:
var m map[string]interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", m)
res, err := json.MarshalIndent(m, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(res))
input
您的 JSON 输入在哪里:
const input = `{
"item": [
{
"value": "274057"
},
[
"38594",
"39957",
"35316",
"35913",
"36668",
"45660",
"41949"
]
]
}`
该程序生成与您所需的输出(或输入)相同的输出:
map[item:[map[value:274057] [38594 39957 35316 35913 36668 45660 41949]]]
{
"item": [
{
"value": "274057"
},
[
"38594",
"39957",
"35316",
"35913",
"36668",
"45660",
"41949"
]
]
}
在Go Playground上尝试完整的应用程序。
分析未编组的地图值:
显然它有一个 key "item"
,它的值的类型:
fmt.Printf("%T\n", m["item"]); // Prints []interface{}
所以是一片。它有 2 个值,它们的类型:
fmt.Printf("%T\n", m["item"].([]interface{})[0]); // map[string]interface{}
fmt.Printf("%T\n", m["item"].([]interface{})[1]); // []interface{}
所以切片包含2个值:
- 一张地图(
"value" : "274057"
一对)
- 和另一个切片(ID 或数字列表)
这是重现相同地图值的 Go 代码:
m := map[string]interface{}{
"item": []interface{}{
map[string]interface{}{"value": "274057"},
[]interface{}{"38594", "39957", "35316", "35913", "36668", "45660", "41949"},
},
}
编组这会产生相同的 JSON 输出。