使用重复键解析JSON(json-cpp)

时间:2015-09-09 12:54:51

标签: json jsoncpp

我正在使用JsonCpp v0.6.0来解析以下JSON字符串:

{
   "3.7":"de305d54-75b4-431b-adb2-eb6b9e546011",
   "3.7":"de305d54-75b4-431b-adb2-eb6b9e546012",
   "3.8":"de305d54-75b4-431b-adb2-eb6b9e546013"
}

如下:

    Json::Value  root;
    Json::Reader reader;

    // value contains the JSON string

    if (!reader.parse(value, root, false))
    {
        // parse error
    }

致电parse后,root在地图中包含两个条目:

[0] first = "3.7", second = "de305d54-75b4-431b-adb2-eb6b9e546012",
[1] first = "3.8", second = "de305d54-75b4-431b-adb2-eb6b9e546013",

即。第一个JSON记录已被第二个覆盖。没有报告错误。

预计会出现这种情况吗?这是对的吗?

我认为可能已报告错误,表明JSON字符串中存在重复的密钥。

2 个答案:

答案 0 :(得分:2)

JSON RFC悲伤一样,对象名称(键)应该是唯一的。

  

对象中的名称应该是唯一的。

RFC也定义了它们是否不可预测。

请参阅RFC中的这句话:

  

名称都是唯一的对象在某种意义上是可互操作的   接收该对象的所有软件实现都会同意   名称 - 值映射。当对象中的名称不是
时   唯一的,接收这样一个对象的软件的行为是
  不可预知的。许多实现报告姓氏/值对   只要。其他实现报告错误或无法解析   对象,以及一些实现报告所有名称/值对,
  包括重复。

答案 1 :(得分:0)

我同意你所说的,但我认为JsonCpp试图成为一个有用的工具,而不是试图通过最小化与RFC的一致性来削减它。 如果它保持输入流的结构,并支持重复键,或者(如果它不喜欢它,这就是OP和我期望的那样)标记错误将更有意义。 静默更改结构是无用的,因为在将其发送到JsonCpp之前,必须使用其他JSON工具检查JSON输入的有效性。