为了账号安全,请及时绑定邮箱和手机立即绑定

go - 如何从标准输入解析无限的json数组?

go - 如何从标准输入解析无限的json数组?

Go
慕尼黑5688855 2021-09-27 16:41:23
我正在尝试为 i3status 编写一个小的替代品,这是一个与符合此协议的i3bar 通信的小程序。他们通过标准输入和标准输出交换消息。两个方向的流都是一个无限的 json 对象数组。从 i3bar 到 i3status(我想替换它)的流的开始看起来像这样:[{"name": "some_name_1","instance": "some_inst_1","button": 1,"x": 213,"y": 35},{"name": "some_name_1","instance": "some_inst_2","button": 2,"x": 687,"y": 354},{"name": "some_name_2","instance": "some_inst","button": 1,"x": 786,"y": 637},{"name": "some_name_3","instance": "some_inst","button": 3,"x": 768,"y": 67}...这是代表点击的对象的“数组”。该阵列永远不会关闭。我现在的问题是:解析这个的正确方法是什么?显然我不能使用这个json库,因为这不是一个有效的 json 对象。
查看完整描述

4 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我也在为 i3 中的点击事件编写自己的处理程序。这就是我偶然发现这个线程的方式。


Golang 标准库实际上确实完成了所需的工作(Golang 1.12)。不确定当你问这个问题的时候有没有?


// json parser read from stdin

decoder := json.NewDecoder(os.Stdin)


// Get he first token - it should be a '['

tk, err := decoder.Token()

if err != nil {

    fmt.Fprintln(os.Stderr, "couldn't read from stdin")

    return

}

// according to the docs a json.Delim is one [, ], { or }

// Make sure the token is a delim

delim, ok := tk.(json.Delim)

if !ok {

    fmt.Fprintln(os.Stderr, "first token not a delim")

    return

}

// Make sure the value of the delim is '['

if delim != json.Delim('[') {

    fmt.Fprintln(os.Stderr, "first token not a [")

    return

}


// The parser took the [ above

// therefore decoder.More() will return

// true until a closing ] is seen - i.e never 

for decoder.More() {

    // make a Click struct with the relevant json structure tags

    click := &Click{}


    // This will block until we have a complete JSON object

    // on stdin

    err = decoder.Decode(click)

    if err != nil {

            fmt.Fprintln(os.Stderr, "couldn't decode click")

            return

    }

    // Do something with click event

}


查看完整回答
反对 回复 2021-09-27
?
万千封印

TA贡献1891条经验 获得超3个赞

您正在寻找的是 JSON 的 Streaming API。有很多可用的快速谷歌搜索显示项目确实将流媒体列为其高级功能之一。


查看完整回答
反对 回复 2021-09-27
  • 4 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信