将json成员字段包装到对象

将json成员字段包装到对象,json,go,Json,Go,我的目标是根据用户请求向json添加字段 一切都很好,但在显示字段时 fmt.Printf("%s: %s\n", content.Date, content.Description) 出现以下错误: 顶级值后的无效字符“{” 这是因为在添加新字段后,文件如下所示: {"Date":"2017-03-20 10:46:48","Description":"new"} {"Date":"2017-03-20 10:46:51","Description":"new .go"} 最大的问题是写入

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

一切都很好,但在显示字段时

fmt.Printf("%s: %s\n", content.Date, content.Description)
出现以下错误:

顶级值后的无效字符“{”

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

{"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)
我真的不知道该怎么做

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


这里有代码:

您应该将提醒存储到json文件中的一个数组中,如@Gerben Jacobs所述,然后,每次您想向数组中添加新的提醒时,您都需要读取
rem.json
的全部内容,在Go中附加新的提醒,截断文件,并将新的片段写入file、 这里有一个快速的实现


如果你有很多提醒,而阅读、解码、编码和写入整个内容的过程变得很痛苦,你可以打开文件,实现一种方法,从文件内容中只截断最后一个
]
,然后只写
+新提醒+
]

你应该将提醒存储到一个数组中正如@Gerben Jacobs所提到的,在json文件中添加一个新的提醒,然后每次你想向数组中添加一个新的提醒时,你需要读取
rem.json
的全部内容,在Go中附加新的提醒,截断文件,并将新的片段写入文件。下面是一个快速实现


如果你有很多提醒,而阅读、解码、编码和编写整个内容的过程变得很痛苦,你可以打开文件,实现一种方法,从文件内容中只截断最后一个
]
,然后只写
+新提醒+
]

,因此经过一些研究后,
<>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
        }
    }
}

现在一切都按我所希望的方式运行。

所以经过一些研究,
疯狂小组的人帮助我,建议我使用一个单独解析项目的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
        }
    }
}

现在一切都按我所希望的方式运行。

如果你想包装在一个对象中,你需要封送为一个映射,并且每个提醒都需要有一个唯一的名称。但是你也可以封送为一个片段,JSON允许根对象成为一个数组。我相信你的文件缺少一个根节点,即所有记录都是没有父节点的同级记录。这就是为什么你需要正在获取顶级值后的“无效字符”{”@Paul,你必须清楚具体地说明你的问题是什么,这是你在阅读.json文件或整理手头的数据时出现的错误吗?@nJoshi我想我的问题非常具体,mkopriva已经显示了我想要的东西,尽管它在我的机器上不工作,但在他的机器上工作。如果你愿意的话将需要封送的对象包装为映射,每个提醒都需要有一个唯一的名称。但是,您也可以封送为片,JSON允许根对象为数组。我相信您的文件缺少根节点,即所有记录都是同级的,没有父级。这就是为什么在顶级值之后出现“无效字符”{”@Paul,你必须清楚具体地说明你的问题是什么,这是你在阅读.json文件或整理手头数据时出现的错误吗?@nJoshi我想我的问题非常具体,mkopriva已经显示了我想要的东西,尽管它在我的机器上不起作用,但在他的机器上起作用。好吧,你的考试ple不起作用,在添加一个提示后,它会显示
EOF
,并且在显示它们时会显示
JSON输入的意外结束
。你确定你逐字复制了代码吗?我刚刚运行了该示例实现,输出如下:。这很奇怪,是的,我这样做了,仍然会发生同样的错误。你的变量err是redeclared 3次。我尝试了两种方式运行它。不确定为什么它对您不起作用…但是关于错误,重新声明错误是可以的,只要它们在新块中重新声明,例如,
如果err:=file.Close();err!=nil{…
或作为多值声明的一部分(
x,y,z:=3,2,1
)其中至少有一个已声明的值以前未在当前块中声明,例如
info,err:=file.Stat()
。好吧,您的示例不起作用,在添加一个提示后,它会显示
EOF
,并且在显示它们时,它会显示
JSON输入的意外结束
。您确定要逐字复制代码吗?我刚刚运行了该示例实现,下面是输出:。这很奇怪,是的,我做了,而且您的v也会出现相同的错误变量错误被重新声明了3次。我尝试了两种方式运行它。不确定为什么它对您不起作用…但是关于错误,重新声明错误是可以的,只要它们在新块中重新声明即可。例如,
if err:=file.Close();err!=nil{…
或作为多值声明的一部分(
x,y,z:=3,2,1
)在当前块中至少有一个声明的值以前没有声明,例如
info,err:=file.Stat()