猿问

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

我正在尝试为 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 对象。


慕尼黑5688855
浏览 194回答 4
4回答

汪汪一只猫

我也在为 i3 中的点击事件编写自己的处理程序。这就是我偶然发现这个线程的方式。Golang 标准库实际上确实完成了所需的工作(Golang 1.12)。不确定当你问这个问题的时候有没有?// json parser read from stdindecoder := 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 delimdelim, 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}

万千封印

您正在寻找的是 JSON 的 Streaming API。有很多可用的快速谷歌搜索显示该项目确实将流媒体列为其高级功能之一。
随时随地看视频慕课网APP

相关分类

Go
我要回答