登录
首页 >  Golang >  Go问答

Golang:将 json 对象解组为切片

来源:stackoverflow

时间:2024-04-08 14:57:33 257浏览 收藏

本篇文章给大家分享《Golang:将 json 对象解组为切片》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我有类似的 json

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

有没有办法将其解组为 []*struct {key string;值 int},保留结构的顺序?

如果我将 json 解组为 map[string]*struct {key string;值 int} 然后将贴图转换为切片,我会丢失结构的顺序。


解决方案


我发现的最简单的方法是使用 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
})

要保持顺序,请使用 Decoder.TokenDecoder.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)
}

Run it on the Go Playground

将对 log.fatal 的调用更改为适合您的应用程序的错误处理。

此答案编辑问题中的 json 以使 json 有效。

结构体元素类型中的字段名称必须为 exported

今天关于《Golang:将 json 对象解组为切片》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>