如何读取包含多个根元素的JSON文件

How to read a JSON file containing multiple root elements?

本文关键字:元素 JSON 文件 包含多 何读取 读取      更新时间:2023-10-16

如果我有一个文件的内容看起来像:

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

我可以简单地将每个单独的行解析为一个单独的JSON对象(使用JsonCpp)。但是,如果文件的结构不那么方便呢

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

没有人提到数组:

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

是有效的JSON,可以执行OP想要的操作。

问题中的两个示例都不是有效的JSON对象;JSON对象可能只有一个根。您必须将文件拆分为两个对象,然后对它们进行解析。

您可以使用http://jsonlint.com查看给定字符串是否为有效的JSON。

因此,我建议要么改变将多个JSON对象转储到单个文件中的方式,将其放在单独的文件中,要么将每个对象作为一个值放在一个JSON根对象中。

如果您无法控制创建这些文件的内容,那么您就只能自己解析文件来挑选不同的根对象。

以下是在JSON对象中编码这些数据的有效方法:

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

如果你真的需要单独的对象,你可以这样做:

{
    "one":
    {
        "number": 1
    },
    "two":
    {
        "number": 2
    }
}
罗布·肯尼迪是对的。第二次调用它将提取下一个对象,依此类推。大多数json-lib不能帮助您在一个根中完成所有操作。除非您在QT中使用更高端的框架。

您可以通过编程在收到的JSON周围添加一对方括号,并绕过"伪根";节点。

但您不必手动执行此操作。有一种叫做JSON Line的东西你可能会感兴趣。

即使您有复杂的对象,您也可以使用此自定义函数来解析多个根元素。

    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;
   }