登录
首页 >  Golang >  Go问答

快速识别 JSON 标签

来源:stackoverflow

时间:2024-03-14 18:15:28 328浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《快速识别 JSON 标签》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我有一堆 json 文件,每个文件都包含非常大的复杂数据数组。 json 文件类似于:

ids.json

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

名称.json:

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

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

我想提取指定其包含的数组类型的标签。目前,我正在使用 encoding/json 将整个文件解组到 map[string]interface{} 并迭代映射,但这种操作成本太高。

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


解决方案


您可以在左大括号之后偏移读取器,然后使用 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)

https://play.golang.org/p/xJJEqj0tFk9

此外,您可以用 bufio.Reader 包装从 open 获得的 io.reader 以避免多次单字节写入

此解决方案假设内容是有效的 json 对象。无论如何,您都可以避免这种情况。

我尝试过使用 decoder.token() 一次读取一个标记(请参阅此 example,第 87 行),这可以提取您的数组标签:

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)

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《快速识别 JSON 标签》文章吧,也可关注golang学习网公众号了解相关技术文章。

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