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

tsh*_*ang 5 c++ jsoncpp

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

{"one": 1}
{"two": 2}
Run Code Online (Sandbox Code Playgroud)

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

{
   "one":1
}

{
   "two":2
}
Run Code Online (Sandbox Code Playgroud)

use*_*eve 15

没有人提到数组:

[
  {"one": 1},
  {"two": 2}
]
Run Code Online (Sandbox Code Playgroud)

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


Alm*_*lmo 5

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

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

所以我建议更改将多个JSON对象转储到单个文件中以在单独的文件中执行它,或者将每个对象作为值放在一个JSON根对象中.

如果您无法控制创建这些文件的任何内容,那么您将无法自行解析文件以选择不同的根对象.

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

{
    "one": 1,
    "two": 2
}
Run Code Online (Sandbox Code Playgroud)

或者如果你真的需要单独的对象,像这样:

{
    "one":
    {
        "number": 1
    },
    "two":
    {
        "number": 2
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不希望任何库处理多个根对象,但我可以想象一个库将其输入视为流并从流中读取一个JSON对象.再次调用它将提取下一个对象,依此类推.我不知道是否有任何JSON库表现出来,但它似乎是一个假设库提供的合理功能. (6认同)
  • 抱歉,我应该提到我们应该假设我无法控制文件的格式。 (2认同)
  • 我不知道一个JSON解析器会处理多个根对象(也许有人可以纠正我),所以你可能会陷入解析来计算匹配{}以找到根对象的位置. (2认同)