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

有效地确定 JSON 标签

有效地确定 JSON 标签

Go
墨色风雨 2023-04-17 16:00:14
我有一堆 JSON 文件,每个文件都包含大量复杂数据。JSON 文件类似于:ids.json{     "ids": [1,2,3] }名称.json:{     "names": ["Tyrion","Jaime","Cersei"] }等等。(实际上,数组元素是具有 10 个字段的复杂结构对象)我只想提取指定它包含哪种数组的标签。目前我正在使用encoding/json将整个文件解组为 amap[string]interface{}并遍历地图,但这是一项成本太高的操作。有没有更快的方法来做到这一点,最好不涉及解组整个数据?
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

您可以在左大括号之后立即偏移阅读器,然后json.Decoder仅用于解码来自阅读器的第一个标记

沿着这些线的东西

sr := strings.NewReader(`{

    "ids": [1,2,3]

}`)


for {

    b, err := sr.ReadByte()

    if err != nil {

        fmt.Println(err)

        return

    }

    if b == '{' {

        break

    }

}


d := json.NewDecoder(sr)


var key string

err := d.Decode(&key)

if err != nil {

    fmt.Println(err)

    return

}


fmt.Println(key)

此外,您可以包装您io.Readeropenwith获得的bufio.Reader信息,以避免多次单字节写入

此解决方案假定内容是一个有效的 JSON 对象。并不是说您无论如何都可以避免这种情况。


查看完整回答
反对 回复 2023-04-17
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我试过Decoder.Token()一次读取一个标记,这可以提取您的数组标签:

const jsonStream = `{

    "ids": [1,2,3]

}`


dec := json.NewDecoder(strings.NewReader(jsonStream))


t, err := dec.Token()

if err != nil {

    log.Fatal(err)

}


fmt.Printf("First token: %v\n", t)


t, err = dec.Token()

if err != nil {

    log.Fatal(err)

}


fmt.Printf("Second token (array label): %v\n", t)


查看完整回答
反对 回复 2023-04-17
  • 2 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信