将json连接到文件时,数组会在需要和添加字母之前关闭

将json连接到文件时,数组会在需要和添加字母之前关闭,json,file,go,Json,File,Go,当我调用一个函数向JSON文件中的数组追加一个结构时,它会在真正需要关闭数组之前关闭数组,添加两个我不知道它们来自何处的字母,并继续写入新数据 这是原始JSON数据包含的内容: [ { "name": "Model of computation", "starts": 19, "ends": 22, "day": 2 }, { "

当我调用一个函数向JSON文件中的数组追加一个结构时,它会在真正需要关闭数组之前关闭数组,添加两个我不知道它们来自何处的字母,并继续写入新数据

这是原始JSON数据包含的内容:

    [
  {
    "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")