I'm trying to write a small replacement for i3status, a small programm that comunicates with i3bar conforming this protocol. They exchange messeages via stdin and stdout.
The stream in both directions is an infinite array of json objects. The start of the stream from i3bar to i3status (which i want to replace) looks like this:
[
{"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}
...
This is an "array" of objects which represent clicks. The array will never close.
My question is now: What is the right way of parsing this?
Obviously I cannot use the json
library because this is not a vaild json object.
Write a custom reader function (or Decoder) which does a "streaming array parse" like so:
[
then return an error (can't be an array).json.Decoder.Decode
into the "next" item.,
then continue the for-loop in #3.]
then exit the for-loop in #3.What you are looking for is a Streaming API for JSON. There are many available a quick Google search revealed this project that does list Streaming as one of it's advance features.
I'm writing my own handler for click events in i3 as well. That's how I stumbled upon this thread.
The Golang standard library does actually do exactly what is required (Golang 1.12). Not sure it did when you asked the question or not?