将json成员字段包装到对象
我的目标是根据用户请求向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"} 最大的问题是写入
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()
。