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

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

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

Go
红糖糍粑 2023-08-14 14:48:32
[  {   "name" : "abc",   "age" : 10  },  {   "name" : "def",   "age" : 12  }]这是我的 text.json 文件,它有 json 对象数组,所以我想要实现的是从文件中读取单个对象,而不是使用 golang 读取整个 json 对象的数组。我不认为 ioutil.ReadAll() 会给我想要的结果。
查看完整描述

2 回答

?
至尊宝的传说

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

希望这能回答您的问题。注释掉的部分是用于一一解码所有对象,因此您甚至可以对其进行优化,以便多个 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


查看完整回答
反对 回复 2023-08-14
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您可以打开该文件,并使用 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)

       }

   }

}

您需要添加错误处理。


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

添加回答

举报

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