猿问

更改文件的最后一个字符

我想不断地将 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)

但是对于这个实现,我需要[]在阅读之前手动(或通过一些脚本)添加范围。如何在关闭每次写入的范围之前添加一个对象?


SMILET
浏览 146回答 1
1回答

繁星coding

您不需要将 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 contentfmt.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]
随时随地看视频慕课网APP

相关分类

Go
我要回答