将JSON结构追加到JSON文件中 Golang

6

我有一个用户的JSON文档,其中包含ID#、电话#和电子邮件。在输入另一个ID、电话和电子邮件后,我希望将新用户的信息附加到文件中。我有一个只包含{ID:#,Phone:#,Email:#}的结构,这个结构运行正常。但我的JSON文件变成了:

[{"ID":"ABCD","Phone":1234567890,"Email":"johndoe@test.com"}]
[{"ID":"EFGH","Phone":1234567890,"Email":"johndoe@test.com"}]
[{"ID":"IJKL","Phone":1234567890,"Email":"johndoe@test.com"}]
[{"ID":"MNOP","Phone":1234567890,"Email":"johndoe@test.com"}]
[{"ID":"QRST","Phone":1234567890,"Email":"johndoe@test.com"}]
[{"ID":"UVWX","Phone":1234567890,"Email":"johndoe@test.com"}]

所以我可以将内容添加到文档中,但它是由方括号[]包围的新JSON结构。以下是我的代码。我省略了实际的哈希ID。

func ToIds(e string, p int64) {
    hashed := GenId()
    var jsonText = []byte(`[
        {"ID": "", "Phone": 0, "Email": ""}
    ]`)
    var I Identification
    err := json.Unmarshal([]byte(jsonText), &I)
    if err != nil {
        fmt.Println(err)
    }
    I[0].ID = hashed
    I[0].Phone = p
    I[0].Email = e

    result, error := json.Marshal(I)
    if error != nil {
        fmt.Println(error)
    }

    f, erro := os.OpenFile("FILE_PATH", os.O_APPEND|os.O_WRONLY, 0666)
    if erro != nil {
        fmt.Println(erro)
    }

    n, err := io.WriteString(f, string(result))
    if err != nil {
        fmt.Println(n, err)
    }

}

这可能会有用,这是我的 Identification 结构体: type Identification []struct { ID string Phone int64
Email string }
基本上,我想要外部括号,并在括号内添加多个用户。像这样:
    [
    {"id":"A", "phone":17145555555, "email":"tom@gmail.com"},
    {"id":"B","phone":15555555555,"email":"p@gmail.com"},
    {"id":"C","phone":14155555555,"email":"bradley@gmail.com"},
    {"id":"D","phone":17135555555,"email":"g@gmail.com"},
    {"id":"E","phone":17125555555,"email":"ann@gmail.com"},
    {"id":"F","phone":17125555555,"email":"sam@gmail.com"},
    {"id":"G","phone":14055555555,"email":"john@gmail.com"},
    {"id":"H","phone":13105555555,"email":"lisa@gmail.com"}
    ]
1个回答

10
为了实现你的输出,按照以下方式定义结构体 -
type Identification struct {
   ID    string
   Phone int64
   Email string
}

然后按以下步骤执行操作 -

// define slice of Identification
var idents []Identification

// Unmarshall it
err := json.Unmarshal([]byte(jsonText), &idents)

// add further value into it
idents = append(idents, Identification{ID: "ID", Phone: 15555555555, Email: "Email"})

// now Marshal it
result, error := json.Marshal(idents)

// now result has your targeted JSON structure

以上解释的示例程序https://play.golang.org/p/67dqOaCWHI


我定义结构体的唯一原因是为了能够通过“for index:= range Identification”来迭代它。你的结构体如何进行迭代?迭代的原因是为了确保我没有重复用户。 - Rohit Panikar
您可以迭代“idents”值。 - jeevatkm
对不起,您说的“idents value”是什么意思?我不太明白如何迭代它。 - Rohit Panikar
请参考答案中添加的play.golang链接,其中还包含了迭代的内容。 - jeevatkm
感谢帮助。 - Rohit Panikar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接