一尘不染

在Go中过滤json流中的非json内容

go

我正在使用Go中的json结构输入流。我从标准输入上的另一个应用程序接收输入流,并且无法更改通信协议。

我的问题是每个json结构都以非json字符串行终止:“ end”(不带引号)。

我正在使用Golang编码器/
json包来解码从stdin接收到的json。问题在于,第二次我使用msg调用解码器时,解码器会产生错误:“无效字符’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,但我不知道如何告诉解码器跳过此内容。

任何帮助,将不胜感激。


阅读 232

收藏
2020-07-02

共1个答案

一尘不染

因此,我能够提出的最佳解决方案是:

  1. 抛弃json解码器,
  2. 从stdin读取一个字节片,
  3. 修剪切片以排除(“ \ nend \ n”)字符串
  4. 将修剪后的切片传递给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)
}
2020-07-02