3 回答
TA贡献1828条经验 获得超3个赞
要保持顺序,请使用Decoder.Token和Decoder.More遍历顶级 JSON 对象。
r := strings.NewReader(`
{
"a": {"key": "a", "value": 1},
"b": {"key": "b", "value": 1}
}`)
d := json.NewDecoder(r)
t, err := d.Token()
if err != nil || t != json.Delim('{') {
log.Fatal("expected object")
}
var result []*element
for d.More() {
k, err := d.Token()
if err != nil {
log.Fatal(err)
}
var v element
if err := d.Decode(&v); err != nil {
log.Fatal(err)
}
result = append(result, &v)
fmt.Println("key:", k, "value:", v)
}
在 Go Playground 上运行它
将对 log.Fatal 的调用更改为适合您的应用程序的错误处理。
此答案编辑问题中的 JSON 以使 JSON 有效。
必须导出结构元素类型中的字段名称。
TA贡献1836条经验 获得超13个赞
您可以使用 map[string]interface{} 来解组 json 字符串。代码是这样的
func test() {
jsonStr := `
{
"a": {"key": "a", "value": 1},
"b": {"key": "b", "value": 1}
}`
var mapResult map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &mapResult)
if err != nil {
fmt.Println("JsonToMapDemo err: ", err)
}
fmt.Println(mapResult)
}
输出为:map[a:map[key:a value:1] b:map[key:b value:1]]
TA贡献1998条经验 获得超6个赞
我发现最简单的方法是使用jsonparser.ObjectEach:
import "github.com/buger/jsonparser"
...
var ss []*struct{Key string; Value int}
err = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
var s struct{Key string; Value int}
if err := json.Unmarshal(value, &s); err != nil {
return err
}
*ss = append(*ss, &s)
return nil
})
- 3 回答
- 0 关注
- 438 浏览
添加回答
举报
