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

Parsing JSON with duplicate keys (json-cpp)

我正在使用 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 字符串中存在重复键。

就像 JSON RFC 遗憾的是,对象名称(键)应该是唯一的。

The names within an object SHOULD be unique.

RFC 还定义了如果它们不是,则行为是不可预测的。

请参阅 RFC 中的这段引用:

An object whose names are all unique is interoperable in the sense
that all software implementations receiving that object will agree on the name-value mappings. When the names within an object are not
unique, the behavior of software that receives such an object is
unpredictable. Many implementations report the last name/value pair
only. Other implementations report an error or fail to parse the
object, and some implementations report all of the name/value pairs,
including duplicates.

我同意你所说的,但我认为 JsonCpp 试图成为一个有用的工具,而不是试图以最低限度地符合 RFC 的方式勉强过关。 如果它保持输入流的结构并支持重复键,或者(这是 OP 和我所期望的)如果它不喜欢它,则标记错误会更有意义。 默默地改变结构是没有帮助的,因为在将它发送到 JsonCpp 之前,必须使用其他一些 JSON 工具来检查 JSON 输入的有效性。