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

2024-01-17

我正在 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 ,但我不知道如何告诉解码器跳过这个。

任何帮助,将不胜感激。


所以我能想到的最好的解决方案是:

  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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Go中过滤json流中的非json内容 的相关文章

随机推荐

  • 在非 UI 线程上实例化视图

    我知道 UI 元素 视图层次结构 只能从 UI 线程进行操作 对于后台操作 可以使用 AsyncTask 它提供事件处理程序来到达 UI 线程 简而言之 是否允许实例化视图 绑定到getApplicationContext 在非 UI 线程
  • 离线时本地存储数据的最佳方法

    我正在编写一个小程序 更多的是与 2010 相比进行实验 尽管是一个实验 但它对我们当地的体育俱乐部有一些实际用途 我的想法是访问数据库 当前在线 以下载当前会员并本地存储在笔记本电脑上 这是一个 MS sql 表 用于为俱乐部网站提供支持
  • 如何在R中的列表中组合不同长度的向量?

    我在组合列表中包含的以下向量时遇到问题 x lt list as numeric c 1 4 as numeric c 3 19 11 names x 1 lt c species A species C names x 2 lt c sp
  • 在 MVC2 中使用不同的端口与 RequireHttps 过滤器

    是否可以使用 RequireHttps 使用 443 以外的其他端口进行过滤 我找不到太多关于它的文档 史蒂夫 桑德森的方法 http blog stevensanderson com 2008 08 05 adding httpsssl
  • 简单的 Scala 序列化?

    我想在 Scala 中进行序列化 我见过类似的sjson https github com debasishg sjson和 serialized 注释 然而 我一直无法看到如何让它们处理 1 个主要障碍 库中的类型擦除和泛型 以Scala
  • Android L 设备不向 Android Wear 智能手表发送通知卡

    我正在尝试在单击按钮时向 Android Wear 智能手表发送通知 它适用于我测试过的所有设备 除了 Android L 的设备 有谁知道可能是什么问题吗 我什至将这些设备与 Android Wear SmartWatch 模拟器配对 但
  • 潜在的空指针访问

    我遇到了一个目前我不太清楚的奇怪情况 当有潜在的空指针访问在 Eclipse 中启用警告 我收到如下警告 警告位于相应注释之前的行 protected Item findItemByName String itemName Items it
  • Gruntjs:如何使复制任务仅复制手表上已更改的文件

    因此 在 grunt contrib watch 插件信息页面上 有一个关于如何使 jshint 仅针对更改的文件运行的示例 grunt initConfig watch scripts files lib js tasks jshint
  • 尝试 ES6 样式导入会出现“无法在模块外部使用导入语句”

    我正在尝试在 intellij 中编写一个 javascript 测试 我需要导入一些依赖项 并且我想使用 ES6 样式导入语句 但出现错误 usr local bin node workspace rr sample node modul
  • Visual Studio 2022 启动项目无法启动

    将 Visual Studio 2022 更新到 17 2 0 版本后出现此错误 The error message pops up when I want to close the Visual Studio by X button or
  • scanf() 将换行符保留在缓冲区中

    我有以下程序 int main int argc char argv int a b char c1 c2 printf Enter something scanf d a line 1 printf Enter other somethi
  • NuGet Package Restore 不会在构建时恢复包

    我正在将我们的源代码从 Vault 移动到 TFS 不关心迁移或其他任何事情 只是在 Vault 中获取最新版本并将其添加到 TFS 该解决方案有多个项目 每个项目至少有一个 NuGet 包 我正在尝试让 Package Restore 再
  • Python,字典的校验和

    我正在考虑创建一个字典的校验和来知道它是否被修改 目前我有 gt gt gt import hashlib gt gt gt import pickle gt gt gt d k v k2 v2 gt gt gt z pickle dump
  • 不能使用类,因为它不是一个特征

    我已按照教程进行操作here http culttt com 2014 01 13 advanced validation service laravel 4 为 Laravel 构建验证服务 我现在在尝试从我的控制器之一调用验证器时遇到问
  • Android 可绘制水平线

    是否可以用xml将line做成这样 或者有什么方法可以做到这一点 我已经做了一些可绘制的形状 但它并不像我想要的那样
  • 如何构建/运行这个简单的 Mahout 程序而不出现异常?

    我想运行我在 Mahout In Action 中找到的这段代码 package org help import java io IOException import java util ArrayList import java util
  • 如何将日志限制为给定提交的所有后代?

    鉴于历史 X Y lt feature A B C D E lt master 我想获取给定提交的后代 一种解决方案似乎是 git log all ancestry path
  • Cassandra 计数器列系列是否支持 TTL?

    Cassandra 是否支持 Counter 列系列的 TTL 具体来说 我们使用 Hector 作为 Cassandra 的客户端 但我没有发现任何 API 接收 TTL 作为参数 至少HFactory createCounterColu
  • Google 文档查看器禁用下载

    请看一下这个链接 http jsfiddle net C7Py6 3 http jsfiddle net C7Py6 3 The last icon on google viewer s toolbar enables user to vi
  • 在Go中过滤json流中的非json内容

    我正在 Go 中使用 json 结构的输入流 我在标准输入上接收来自另一个应用程序的输入流 并且无法更改通信协议 我遇到的问题是每个 json 结构都由非 json 字符串行终止 end 不带引号 我正在使用 Golang 编码器 json