将json成员字段包装到对象

时间:2017-03-20 09:20:33

标签: json go

我的目标是根据用户请求向json添加字段。

一切都很棒,但用

显示字段时
fmt.Printf("%s: %s\n", content.Date, content.Description)

发生错误:

invalid character '{' after top-level value

这是因为添加新字段后文件如下所示:

{"Date":"2017-03-20 10:46:48","Description":"new"}
{"Date":"2017-03-20 10:46:51","Description":"new .go"}

最大的问题是写入文件

reminder := &Name{dateString[:19], text} //text - input string
newReminder, _ := json.Marshal(&reminder)

我真的不知道如何正确地做到这一点

我的问题是如何将所有成员字段包装成一个对象? 迭代成员字段的最佳方法是什么?

代码可在此处找到:https://play.golang.org/p/NunV_B6sud

2 个答案:

答案 0 :(得分:0)

您应该将提醒存储到json文件中的数组中,如@Gerben Jacobs所述,然后,每次要向数组添加新提醒时,您需要阅读{{1}的完整内容,在Go中附加新提醒,截断文件,并将新切片写入文件。这是一个快速实施https://play.golang.org/p/UKR91maQF2

如果您有很多提醒,并且阅读,解码,编码和编写整个内容的过程变得很麻烦,您可以打开文件,实现一种方法来截断文件内容中的最后rem.json ,然后只写] +新提醒+ ,

答案 1 :(得分:0)

经过一些研究,go-nuts组中的人帮助了我并建议我使用流式json解析器来单独解析项目。

所以我需要更改提醒列表功能:

func listReminders() error {
    f, err := os.Open("rem.json")
    if err != nil {
        return err
    }
    dec := json.NewDecoder(f)
    for {
        var content Name
        switch dec.Decode(&content) {
        case nil:
            fmt.Printf("%#v\n", content)
        case io.EOF:
            return nil
        default:
            return err
        }
    }
}

现在一切都按照我想要的方式运作。