3

このプロトコルに準拠した i3bar と通信する小さなプログラムである i3status の小さな代替品を作成しようとしています。それらは stdin と stdout を介してメッセージを交換します。

両方向のストリームは、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

3 に答える 3

6

次のように「ストリーミング配列解析」を行うカスタム リーダー関数 (またはデコーダー) を記述します。

  1. 先頭の空白を読み取って破棄します。
  2. 次の文字が a でない場合[、エラーを返します (配列にすることはできません)。
  3. true の場合:
    1. json.Decoder.Decode「次の」項目を呼び出します。
    2. 「次の」アイテムを生成または処理します。
    3. 空白を読み取って破棄します。
    4. 次の文字の場合:
      1. コンマ,は、#3 の for ループを続けます。
      2. ]#3 の for ループは閉じ括弧で終了します。
      3. それ以外の場合は、エラー (無効な配列構文) が返されます。
于 2015-04-03T01:42:31.357 に答える