【发布时间】:2012-07-23 07:17:06
【问题描述】:
如果我有一个内容如下所示的文件:
{"one": 1}
{"two": 2}
我可以简单地将每个单独的行解析为单独的 JSON 对象(使用 JsonCpp)。但是如果文件的结构像这样不太方便怎么办:
{
"one":1
}
{
"two":2
}
【问题讨论】:
如果我有一个内容如下所示的文件:
{"one": 1}
{"two": 2}
我可以简单地将每个单独的行解析为单独的 JSON 对象(使用 JsonCpp)。但是如果文件的结构像这样不太方便怎么办:
{
"one":1
}
{
"two":2
}
【问题讨论】:
您问题中的两个示例都不是有效的 JSON 对象; JSON 对象可能只有 一个 根。您必须将文件拆分为两个对象,然后解析它们。
您可以使用http://jsonlint.com 来查看给定的字符串是否为有效的 JSON。
所以我建议要么更改将多个 JSON 对象转储到单个文件中的内容,以便在单独的文件中执行此操作,要么将每个对象作为一个值放入一个 JSON 根对象中。
如果您无法控制创建这些文件的内容,那么您将不得不自己解析文件以挑选不同的根对象。
这是在 JSON 对象中编码这些数据的有效方法:
{
"one": 1,
"two": 2
}
如果你真的需要单独的对象,你可以这样做:
{
"one":
{
"number": 1
},
"two":
{
"number": 2
}
}
【讨论】:
罗布·肯尼迪是对的。再次调用它会提取下一个对象,依此类推。大多数 json 库无法帮助您在一个根目录中完成所有操作。除非你在 QT 中使用更高端的框架。
【讨论】:
没有人提到数组:
[
{"one": 1},
{"two": 2}
]
是有效的 JSON,可能会做 OP 想要的。
【讨论】:
即使您有复杂的对象,您也可以使用此自定义函数来解析多个根元素。
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;
}
【讨论】: