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

如何从具有Golang中json对象列表的文件中读取单个json对象

如何从具有Golang中json对象列表的文件中读取单个json对象

Go
慕标5832272 2022-04-26 10:30:47
[  {   "name" : "abc",   "age" : 10  },  {   "name" : "def",   "age" : 12  }]所以这是我的 text.json 文件,它有 json 对象数组,所以我想要实现的是从文件中读取单个对象,而不是使用 golang 读取整个 json 对象的数组。我不认为 ioutil.ReadAll() 会给我想要的结果。
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

希望这能回答你的问题。注释掉的部分是用于一一解码所有对象,因此您甚至可以对其进行优化,以便多个 goroutine 可以同时进行解码。


包主


import (

    "encoding/json"

    "fmt"

    "log"

    "os"

)


type jsonStore struct {

    Name string

    Age  int

}


func main() {

    file, err := os.Open("text.json")

    if err != nil {

        log.Println("Can't read file")

    }

    defer file.Close()


    // NewDecoder that reads from file (Recommended when handling big files)

    // It doesn't keeps the whole in memory, and hence use less resources

    decoder := json.NewDecoder(file)

    var data jsonStore


    // Reads the array open bracket

    decoder.Token()


    // Decode reads the next JSON-encoded value from its input and stores it

    decoder.Decode(&data)


    // Prints the first single JSON object

    fmt.Printf("Name: %#v, Age: %#v\n", data.Name, data.Age)


    /*

        // If you want to read all the objects one by one

        var dataArr []jsonStore


        // Reads the array open bracket

        decoder.Token()


        // Appends decoded object to dataArr until every object gets parsed

        for decoder.More() {

            decoder.Decode(&data)

            dataArr = append(dataArr, data)

        }

    */

}

输出


Name: "abc", Age: 10


查看完整回答
反对 回复 2022-04-26
?
不负相思意

TA贡献1777条经验 获得超10个赞

您可以打开文件,然后使用 json.Decoder 开始读取它。读取数组第一个元素的代码草图如下所示:


decoder:=json.NewDecoder(f)

t,err:=decoder.Token()

tok, ok:=t.(json.Delim) 

if ok {

   if tok=='[' {

       for decoder.More() {

         decoder.Decode(&oneEntry)

       }

   }

}

您需要添加错误处理。


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

添加回答

举报

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