【发布时间】:2013-07-14 14:58:00
【问题描述】:
我正在使用 Go 中的 json 结构输入流。我在我的标准输入上接收到来自另一个应用程序的输入流,但我无法更改通信协议。
我遇到的问题是每个 json 结构都由一个非 json 字符串行终止:“end”(不带引号)。
我正在使用 Golang 编码器/json 包来解码我从标准输入接收到的 json。问题是解码器在我第二次使用 msg 调用它时产生错误:“invalid character 'e' looking for beginning of value”。
问题当然是“end”字符串不是 json 编码的。我想知道如何让 Go 的 json 解码器跳过这个字符串?
一些示例输入:
{"command": "ack", "id": "1231231"}
end
{"command": "fail", "id": "1231231"}
end
{
"command": "log",
// the message to log
"msg": "hello world!"
}
end
我尝试过的事情:
- 我声明:endStr := make([]byte, 10)
- 我尝试使用 fmt.Fscanf(os.Stdin, "%s", endStr) 来读取字符串,但没有读取任何数据。
- 我尝试使用 os.Stdin.Read(endStr),但它也没有返回任何数据。
- 读取第一个 json 结构后,dec.Buffered() 返回一个包含“end”字符串的 io.Reader,但我不知道如何告诉解码器跳过这个。
任何帮助将不胜感激。
【问题讨论】:
-
首先:JSON 解码仅适用于有效的 JSON 输入,因此您必须在解码每个块之前在这些“结束”标记处拆分输入流。
-
第一:显示完整的代码和真实的示例输入。第二:JSON 解码仅适用于有效的 JSON 输入,因此您必须在解码每个块之前在这些“结束”标记处拆分输入流。根据您的实际输入数据,您可以尝试golang.org/pkg/bufio/#Scanner 使用自定义拆分功能,该功能在您的“结束”标记处拆分。再说一遍:如果可能的话,在 play.golang.org 上提供演示输入(点击返回太快...)