我正在使用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字符串中存在重复的密钥。
答案 0 :(得分:2)
与JSON RFC悲伤一样,对象名称(键)应该是唯一的。
对象中的名称应该是唯一的。
RFC也定义了它们是否不可预测。
请参阅RFC中的这句话:
名称都是唯一的对象在某种意义上是可互操作的 接收该对象的所有软件实现都会同意 名称 - 值映射。当对象中的名称不是
时 唯一的,接收这样一个对象的软件的行为是
不可预知的。许多实现报告姓氏/值对 只要。其他实现报告错误或无法解析 对象,以及一些实现报告所有名称/值对,
包括重复。
答案 1 :(得分:0)
我同意你所说的,但我认为JsonCpp试图成为一个有用的工具,而不是试图通过最小化与RFC的一致性来削减它。 如果它保持输入流的结构,并支持重复键,或者(如果它不喜欢它,这就是OP和我期望的那样)标记错误将更有意义。 静默更改结构是无用的,因为在将其发送到JsonCpp之前,必须使用其他JSON工具检查JSON输入的有效性。