10

内容が次のようなファイルがある場合:

{"one": 1}
{"two": 2}

( JsonCppを使用して)個別のJSONオブジェクトとして各個別の行を解析するだけで済みます。しかし、ファイルの構造が次のように不便だった場合はどうでしょうか。

{
   "one":1
}

{
   "two":2
}
4

4 に答える 4

16

アレイについては誰も言及していません。

[
  {"one": 1},
  {"two": 2}
]

有効なJSONであり、OPが望むことを実行する可能性があります。

于 2018-05-09T10:09:39.970 に答える
7

あなたの質問のどちらの例も有効なJSONオブジェクトではありません。JSONオブジェクトにはルートが1つしかない場合があります。ファイルを2つのオブジェクトに分割してから、それらを解析する必要があります。

http://jsonlint.comを使用して、特定の文字列が有効なJSONであるかどうかを確認できます。

したがって、複数のJSONオブジェクトを1つのファイルにダンプするものを変更して、別々のファイルで実行するか、各オブジェクトを1つのJSONルートオブジェクトの値として配置することをお勧めします。

これらを作成しているものを制御できない場合は、ファイルを自分で解析してさまざまなルートオブジェクトを選択することに固執します。

これらのデータをJSONオブジェクトにエンコードする有効な方法は次のとおりです。

{
    "one": 1,
    "two": 2
}

本当に個別のオブジェクトが必要な場合は、次のように実行できます。

{
    "one":
    {
        "number": 1
    },
    "two":
    {
        "number": 2
    }
}
于 2012-07-24T21:57:17.067 に答える
2

ロブ・ケネディは正しいです。もう一度呼び出すと、次のオブジェクトが抽出されます。jsonlibのほとんどは、単一のルートですべてを実行するのに役立ちません。QTでよりハイエンドのフレームワークを使用している場合を除きます。

于 2012-12-05T01:46:50.267 に答える
-1

複雑なオブジェクトがある場合でも、このカスタム関数を使用して複数のルート要素を解析することもできます。

    static getParsedJson(jsonString) {
      const parsedJsonArr = [];
      let tempStr = '';
      let isObjStartFound = false;
      for (let i = 0; i < jsonString.length; i += 1) {
          if (isObjStartFound) {
              tempStr += jsonString[i];
              if (jsonString[i] === '}') {
                  try {
                      const obj = JSON.parse(tempStr);
                      parsedJsonArr.push(obj);
                      tempStr = '';
                      isObjStartFound = false;
                  } catch (err) {
                      // console.log("not a valid JSON object");
                  }
              }
          }
          if (!isObjStartFound && jsonString[i] === '{') {
              tempStr += jsonString[i];
              isObjStartFound = true;
          }
       }
       return parsedJsonArr;
   }
于 2020-07-01T18:45:35.677 に答える