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

更改文件的最后一个字符

更改文件的最后一个字符

Go
SMILET 2023-06-12 14:17:16
我想不断地将 json 对象写入文件。为了能够阅读它,我需要将它们包装到一个数组中。我不想阅读整个文件,只是为了简单的附加。所以我现在在做什么:comma := []byte(", ")    file, err := os.OpenFile(erp.TransactionsPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)    if err != nil {        return err    }    transaction, err := json.Marshal(t)    if err != nil {        return err    }    transaction = append(transaction, comma...)    file.Write(transaction)但是对于这个实现,我需要[]在阅读之前手动(或通过一些脚本)添加范围。如何在关闭每次写入的范围之前添加一个对象?
查看完整描述

1 回答

?
繁星coding

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

您不需要将 JSON 对象包装到数组中,您可以按原样编写它们。您可以用来json.Encoder将它们写入文件,也可以用来json.Decoder读取它们。Encoder.Encode()并对Decoder.Decode()流中的各个 JSON 值进行编码和解码。

为了证明它有效,请看这个简单的例子:

const src = `{"id":"1"}{"id":"2"}{"id":"3"}`

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


for {

    var m map[string]interface{}

    if err := dec.Decode(&m); err != nil {

        if err == io.EOF {

            break

        }

        panic(err)

    }

    fmt.Println("Read:", m)

}

它输出(在Go Playground上试试):

Read: map[id:1]
Read: map[id:2]
Read: map[id:3]

写入文件/从文件读取时,将os.Filetojson.NewEncoder()json.NewDecoder().

这是一个完整的演示,它创建一个临时文件,用于json.Encoder将 JSON 对象写入其中,然后使用以下命令读回它们json.Decoder

objs := []map[string]interface{}{

    map[string]interface{}{"id": "1"},

    map[string]interface{}{"id": "2"},

    map[string]interface{}{"id": "3"},

}


file, err := ioutil.TempFile("", "test.json")

if err != nil {

    panic(err)

}


// Writing to file:

enc := json.NewEncoder(file)

for _, obj := range objs {

    if err := enc.Encode(obj); err != nil {

        panic(err)

    }

}


// Debug: print file's content

fmt.Println("File content:")

if data, err := ioutil.ReadFile(file.Name()); err != nil {

    panic(err)

} else {

    fmt.Println(string(data))

}


// Reading from file:

if _, err := file.Seek(0, io.SeekStart); err != nil {

    panic(err)

}

dec := json.NewDecoder(file)

for {

    var obj map[string]interface{}

    if err := dec.Decode(&obj); err != nil {

        if err == io.EOF {

            break

        }

        panic(err)

    }

    fmt.Println("Read:", obj)

}

它输出(在Go Playground上试试):


File content:

{"id":"1"}

{"id":"2"}

{"id":"3"}


Read: map[id:1]

Read: map[id:2]

Read: map[id:3]


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

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