Golang:将 json 对象解组为切片

我有 JSON 之类的


{

  "a": {"key": "a", "value": 1,},

  "b": {"key": "b", "value": 1,},

}

有没有办法将它解[]*struct {Key string; Value int}组,保留结构的顺序?


如果我将 JSON 解组为map[string]*struct {Key string; Value int}然后将地图转换为切片,我将失去结构的顺序。


心有法竹
浏览 439回答 3
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 []*elementfor 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 有效。必须导出结构元素类型中的字段名称。

开心每一天1111

您可以使用 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]]

米琪卡哇伊

我发现最简单的方法是使用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})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go