有效地确定 JSON 标签

我有一堆 JSON 文件,每个文件都包含大量复杂数据。JSON 文件类似于:

ids.json

{  
  "ids": [1,2,3]
}

名称.json:

{  
  "names": ["Tyrion","Jaime","Cersei"]
}

等等。(实际上,数组元素是具有 10 个字段的复杂结构对象)

我只想提取指定它包含哪种数组的标签。目前我正在使用encoding/json将整个文件解组为 amap[string]interface{}并遍历地图,但这是一项成本太高的操作。

有没有更快的方法来做到这一点,最好不涉及解组整个数据?



墨色风雨
浏览 92回答 2
2回答

LEATH

您可以在左大括号之后立即偏移阅读器,然后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 stringerr := d.Decode(&key)if err != nil {    fmt.Println(err)    return}fmt.Println(key)此外,您可以包装您io.Reader从openwith获得的bufio.Reader信息,以避免多次单字节写入此解决方案假定内容是一个有效的 JSON 对象。并不是说您无论如何都可以避免这种情况。

蝴蝶不菲

我试过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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go