我正在 Go 中使用 json 结构的输入流。我在标准输入上接收来自另一个应用程序的输入流,并且无法更改通信协议。
我遇到的问题是每个 json 结构都由非 json 字符串行终止:“end”(不带引号)。
我正在使用 Golang 编码器/json 包来解码从 stdin 接收到的 json。问题是解码器在我第二次使用消息调用它时产生错误:“寻找值的开头的字符'e'无效”。
当然,问题是“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 解码器,
- 从 stdin 读取一个字节片,
- 修剪切片以排除 ("\nend\n") 字符串
- 将修剪后的切片传递给 json Unmarshaller
我必须编写的代码:
// Create a buffer to hold the stream data
data := make([]byte, 5000)
// Read data from stdin in a loop
for {
_, err = os.Stdin.Read(data)
if err != nil {
panic(err)
}
index := bytes.Index(data, []byte("\n"))
data = data[:index]
var myStruct MyStruct
err = json.Unmarshal(data, &myStruct)
if err != nil {
panic(err)
}
//(Do something with myStruct)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)