将json连接到文件时,数组会在需要和添加字母之前关闭
当我调用一个函数向JSON文件中的数组追加一个结构时,它会在真正需要关闭数组之前关闭数组,添加两个我不知道它们来自何处的字母,并继续写入新数据 这是原始JSON数据包含的内容:将json连接到文件时,数组会在需要和添加字母之前关闭,json,file,go,Json,File,Go,当我调用一个函数向JSON文件中的数组追加一个结构时,它会在真正需要关闭数组之前关闭数组,添加两个我不知道它们来自何处的字母,并继续写入新数据 这是原始JSON数据包含的内容: [ { "name": "Model of computation", "starts": 19, "ends": 22, "day": 2 }, { "
[
{
"name": "Model of computation",
"starts": 19,
"ends": 22,
"day": 2
},
{
"name": "Parallel computing - lecture",
"starts": 17,
"ends": 21,
"day": 0
},
{
"name": "Model of computation",
"starts": 17,
"ends": 21,
"day": 3
},
{
"name": "Parallel computing - practice",
"starts": 11,
"ends": 14,
"day": 5
}
]
这就是模型:
type Lesson struct {
Name string `json:"name"`
Day int `json:"day"`
Starts int `json:"starts"`
Ends int `json:"ends"`
}
这就是功能:
func AddLessonToJSON() error {
les := models.Lesson{Name: "Omri Test", Day: 3, Starts: 12, Ends: 15}
jsonFile, err := os.OpenFile(jsonPath, os.O_RDWR, 777)
if err != nil {
return err
}
defer jsonFile.Close()
data, err := ioutil.ReadAll(jsonFile)
if err != nil {
return err
}
var lessons []models.Lesson
json.Unmarshal([]byte(data), &lessons)
lessons = append(lessons, les)
jsonArr, err := json.Marshal(lessons)
if err != nil {
return err
}
jsonFile.Seek(0, os.SEEK_SET)
fmt.Println(string(jsonArr))
if _, err := jsonFile.WriteString(string(jsonArr)); err != nil {
return err
}
return nil
}
控制台输出:
[{"name":"Model of computation","day":2,"starts":19,"ends":22},{"name":"Parallel computing - lecture","day":0,"starts":17,"ends":21},{"name":"Model of computation","day":3,"starts":17,"ends":21},{"name":"Parallel computing - practice","day":5,"starts":11,"ends":14},{"name":"Omri Test","day":3,"starts":12,"ends":15}]
与我想的完全一样,但文件本身的输出:
[{"name":"Model of computation","day":2,"starts":19,"ends":22},{"name":"Parallel computing - lecture","day":0,"starts":17,"ends":21},{"name":"Model of computation","day":3,"starts":17,"ends":21},{"name":"Parallel computing - practice","day":5,"starts":11,"ends":14},{"name":"Omri Test","day":3,"starts":12,"ends":15}]me": "Parallel computing - practice",
"starts": 11,
"ends": 14,
"day": 5
}
]
这是因为您的输入JSON文件是JSON格式的(打印得很漂亮)。但是您正在写入同一文件的内容不是。因此,在
jsonFile.WriteString(string(jsonArr))
中,与原始文件相比,向文件写入的字节更少。字节的差异保持不变。您可以通过以下方式进行验证:
info, err := jsonFile.Stat()
if err != nil {
panic(err)
}
fmt.Println("Stat: ", info.Size())
fmt.Println("len of jsonArray: ", len(jsonArr))
// File size will be higher than your json array even though json
// array has an additional Lesson, as the json file has indents and
// newlines in addition to the data.
你可以通过
- 使用缩进json覆盖文件
- 使输入json文件缩小
jsonArr, err := json.MarshalIndent(lessons, "", "\t")