为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:将 json 对象解组为切片

Golang:将 json 对象解组为切片

Go
心有法竹 2022-06-27 11:08:52
我有 JSON 之类的{  "a": {"key": "a", "value": 1,},  "b": {"key": "b", "value": 1,},}有没有办法将它解[]*struct {Key string; Value int}组,保留结构的顺序?如果我将 JSON 解组为map[string]*struct {Key string; Value int}然后将地图转换为切片,我将失去结构的顺序。
查看完整描述

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 有效。


必须导出结构元素类型中的字段名称。


查看完整回答
反对 回复 2022-06-27
?
开心每一天1111

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]]


查看完整回答
反对 回复 2022-06-27
?
米琪卡哇伊

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

})


查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号