内容が次のようなファイルがある場合:
{"one": 1}
{"two": 2}
( JsonCppを使用して)個別のJSONオブジェクトとして各個別の行を解析するだけで済みます。しかし、ファイルの構造が次のように不便だった場合はどうでしょうか。
{
"one":1
}
{
"two":2
}
アレイについては誰も言及していません。
[
{"one": 1},
{"two": 2}
]
有効なJSONであり、OPが望むことを実行する可能性があります。
あなたの質問のどちらの例も有効なJSONオブジェクトではありません。JSONオブジェクトにはルートが1つしかない場合があります。ファイルを2つのオブジェクトに分割してから、それらを解析する必要があります。
http://jsonlint.comを使用して、特定の文字列が有効なJSONであるかどうかを確認できます。
したがって、複数のJSONオブジェクトを1つのファイルにダンプするものを変更して、別々のファイルで実行するか、各オブジェクトを1つのJSONルートオブジェクトの値として配置することをお勧めします。
これらを作成しているものを制御できない場合は、ファイルを自分で解析してさまざまなルートオブジェクトを選択することに固執します。
これらのデータをJSONオブジェクトにエンコードする有効な方法は次のとおりです。
{
"one": 1,
"two": 2
}
本当に個別のオブジェクトが必要な場合は、次のように実行できます。
{
"one":
{
"number": 1
},
"two":
{
"number": 2
}
}
ロブ・ケネディは正しいです。もう一度呼び出すと、次のオブジェクトが抽出されます。jsonlibのほとんどは、単一のルートですべてを実行するのに役立ちません。QTでよりハイエンドのフレームワークを使用している場合を除きます。
複雑なオブジェクトがある場合でも、このカスタム関数を使用して複数のルート要素を解析することもできます。
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;
}