当前位置: 首页 > 面试题库 >

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

翟源
2023-03-14
问题内容

我正在使用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,但我不知道如何告诉解码器跳过此内容。

任何帮助,将不胜感激。


问题答案:

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

  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)
}


 类似资料:
  • 问题内容: 我花了很多时间为我的问题找到解决方案。 在此示例中,我在SetNavRecords数组中有2条记录。第一个是 “ Artikelnummer”:“ 21700” ,第二个是 “ Artikelnummer”:“ 21701” 每个记录都有一个数组“ OfflineVerkaufspreis”。 对我来说重要的是“ OfflineVerkaufspreis”中的“ Location_Co

  • 所以我有一个JSON url,里面有一些数据,比如名字、纬度和经度。然而,并不是每个对象都有经纬度,我只想显示具有经纬度的对象的名称。 带有lat和LNG的JSON示例对象:

  • 我有一个如下的控制器, 我有另一个这样的控制器, 我的结果结构如下: 这扩展了结果类: 现在,我将要设置到结果字段中的模型是, 现在,对于上面提到的TestController,我想显示json响应中的所有字段,而在SecondTestController中,我想屏蔽(不显示)json响应中的age属性。在Spring我该如何实现这一点。非常感谢任何帮助!

  • 问题内容: 嗨,我正在Go中使用rest API,我希望用户传递JSON参数: 但是它们并非总是必需的,例如,用户只能通过而忽略其他用户。他甚至可以发送0个参数。我怎样才能做到这一点? 问题答案: 从JSON文本解组值时,程序包不需要所有字段都以JSON形式出现,也不需要所有JSON字段都具有匹配的Go字段。 因此,您没有什么特别的事情要做,只需解组您必须拥有的东西,以获取您想要或可能想要的价值。

  • 问题内容: 如何使用Javascript或jQuery过滤JSON数据? 这是我的JSON数据: JavaScript: 现在我只想要包含网站的名称和网站数据等于 “ yahoo” 问题答案: 这是您应该怎么做的方法:(适用于Google查找) 更好的 解决方案:(Salman’s) http://jsbin.com/yakubixi/4/edit

  • 这个问题类似于常规WebClient请求中的Spring反应式流数据,不同之处在于我没有立即从我的WebClient获得JSON数组,而是类似于这样: 这个JSON对象可能非常大(约100MB),因此需要处理并流到客户端,而不是解析。这是我似乎能够正确获得语义学的唯一方法: 但是这意味着我要在内存中反序列化100MB或更多,然后从中创建一个通量。我想知道的是:我是否错过了一些关键的东西?我能以某种