5

#シェルスタイルの行コメントを含む「リラックスした」JSON データを操作するシステムを扱っています。

[
  {
    # Batman
    "first-name": "Bruce",
    "last-name": "Wayne"
  },
  {
    # Superman
    "first-name": "Clark",
    "last-name": "Kent"
  }
]

私が取り組んでいるシステムの一部では、JSON 入力を解析するためにjson-libを使用しています。

これらのコメントから追加の注釈を抽出する必要がありますが、json-lib はそれらを読み取るための API を提供せずにそれらを破棄しているようです。

JSONObject map = (JSONObject)JSONSerializer.toJSON("{\n"+
                                                   "    # Batman\n" + // note the shell-style # comment
                                                   "    \"first-name\": \"Bruce\",\n" +
                                                   "    \"last-name\": \"Wayne\"\n" +
                                                   "}");
System.out.println(map.toString());
/* <<'OUTPUT'
 * {"first-name":"Bruce","last-name":"Wayne"}
 * OUTPUT
 * note the absence of the shell-style comment
 */

コメントは JSON 仕様の一部ではないため、これは理にかなっています。幸いなことに、そもそもコメントを解析するときに json-lib が詰まることはありません。

注:

  • 他のシステムはこの同じ JSON を使用し、注釈はそれらに対して透過的である必要があるため、代わりにコメントのプロパティを追加して JSON 構造を変更することはできません。
  • システム内のすべてのコンポーネントとオブジェクトが生の JSON ソースにアクセスできるわけではありません。1 つのコンポーネントがファイルを読み取り、JSONlib を使用して解析し、デシリアライズされたマップなどを渡します。

JSON 入力の処理中にこれらのコメントを読み取って解析するにはどうすればよいですか? それらを読み取って JSON 内の位置に関連付けることができるライブラリはありますBatmanか?コメントを「Bruce Wayne」エントリに簡単に接続できますか?

私は現在 json-lib を使用していますが、他の JSON ライブラリを調査することにもオープンであり、YAML などの JSON を拡張する他の言語を使用することにも同様にオープンです。私の入力のコメント。

4

2 に答える 2

4

編集 (2021 年 5 月 27 日):

私が選択したのは、この非標準バージョンの JSON 用のカスタム JSON パーサーを作成することです。質問で指定されたシェル コメントをサポートしますが、JSON オブジェクトの最初のキーの前のみです。

(上記は C# によるものです。Java バージョンも利用可能になる予定です。これは、NuGet の PeterO.Cbor または中央リポジトリの com.upokecenter/cbor と呼ばれる、簡潔なバイナリ オブジェクト表現ライブラリに依存しています。)

実際、要件の 1 つは、「代わりにコメントのプロパティを追加して JSON 構造を変更できない」ことです。つまり、コメントは別の方法で JSON オブジェクトに関連付ける必要があります。幸いなことに、JSON ポインターと呼ばれる仕様が最近 RFC 6901 として公開されました。JSON ポインターは、別の JSON オブジェクト内の JSON オブジェクトを参照する文字列です。これが、パーサーが と呼ばれるメソッドを介してコメントとそれに関連付けられた JSON ポインターを取得する方法を含む理由JSONWithComments.FromJSONStringWithPointersです。JSONPointer.csJSON Pointer 仕様の私自身の実装です。

使用例:

      dict=new Dictionary<string, string>();
      str="{\"f\":[\n {\n # B\t \tA C\n # Dm\n\"a\":1,\n\"b\":2\n},{\n #" +
"\u0020Sm\n\"a\":3,\n\"b\":4\n}\n]}";
       obj = JSONWithComments.FromJSONString(str);
      Console.WriteLine(obj);
       obj = JSONWithComments.FromJSONStringWithPointers(str, dict);
       // Get the comment and its associated JSON pointer
       foreach(string key in dict.Keys) {
         Console.WriteLine(key);
         Console.WriteLine(dict[key]);
         // Get the pointed-to object
         Console.WriteLine(JSONPointer.GetObject(obj,dict[key]));
       }
       // Output the object
      Console.WriteLine(obj);
于 2013-05-07T00:53:06.677 に答える