【问题标题】:How to read a JSON file containing multiple root elements?如何读取包含多个根元素的 JSON 文件?
【发布时间】:2012-07-23 07:17:06
【问题描述】:

如果我有一个内容如下所示的文件:

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

我可以简单地将每个单独的行解析为单独的 JSON 对象(使用 JsonCpp)。但是如果文件的结构像这样不太方便怎么办:

{
   "one":1
}

{
   "two":2
}

【问题讨论】:

标签: c++ jsoncpp


【解决方案1】:

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

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

所以我建议要么更改将多个 JSON 对象转储到单个文件中的内容,以便在单独的文件中执行此操作,要么将每个对象作为一个值放入一个 JSON 根对象中。

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

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

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

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

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

【讨论】:

  • 第一个例子也不是一个有效的对象,这就是问题的重点。
  • 对不起,我应该提到我们应该假设我无法控制文件的格式。
  • 我不知道会处理多个根对象的 JSON 解析器(也许有人可以纠正我),所以你可能会卡住解析以计数匹配 {} 来查找根对象的位置.
  • 当我在 Google 上苦苦搜索但没有成功时,我感到很惊讶。
  • 我不希望任何库处理多个根对象,但我可以想象一个库将其输入视为流并从流中读取一个 JSON 对象。再次调用它会提取下一个对象,依此类推。我不知道是否有任何 JSON 库有这种行为,但对于假设的库来说,这似乎是一个合理的功能。
【解决方案2】:

罗布·肯尼迪是对的。再次调用它会提取下一个对象,依此类推。大多数 json 库无法帮助您在一个根目录中完成所有操作。除非你在 QT 中使用更高端的框架。

【讨论】:

    【解决方案3】:

    没有人提到数组:

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

    是有效的 JSON,可能会做 OP 想要的。

    【讨论】:

    • 这实际上为我做了这件事。具有多个根元素的大文件的一个非常好的解决方法,通常是从某个系统转储的。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多