JsonCPP抛出logic error: requires objectValue or nullValue问题排查
错误原因
- JsonCPP的
isMember()方法仅支持**对象类型(objectValue)**调用,作用是查询对象中是否存在指定键名。上层m_root.isMember(a)未报错,是因为m_root本身为对象类型,符合方法调用要求。 - 第一次传入
a="hey"时,代码进入else分支,将m_root["hey"]设置为数组类型(arrayValue)。第四次调用时a="hey"已存在,进入第一个if分支后,代码对数组类型的m_root[a]调用isMember(),触发类型不匹配错误。 - 原有逻辑本身存在设计错误:即使
m_root[a]为对象类型,判断存在b键后调用append()方法依然会报错,append()是数组类型专属方法,对象类型不支持该操作。
修复方案
根据常见的业务需求,提供两种修复方案:
方案1:直接追加b到a对应的数组中(无去重要求)
void exp::example(std::string &a, std::string &b) { // 若m_root不是对象、a不存在、a对应值不是数组,统一重置a为新数组 if (!m_root.isObject() || !m_root.isMember(a) || !m_root[a].isArray()) { m_root[a] = Json::arrayValue; } m_root[a].append(b); }
方案2:追加前校验数组中不存在重复的b值
数组查询包含关系不能使用isMember(),需要遍历数组校验:
void exp::example(std::string &a, std::string &b) { if (!m_root.isObject() || !m_root.isMember(a) || !m_root[a].isArray()) { m_root[a] = Json::arrayValue; } bool isDuplicate = false; for (const auto& item : m_root[a]) { if (item.isString() && item.asString() == b) { isDuplicate = true; break; } } if (!isDuplicate) { m_root[a].append(b); } }
内容的提问来源于stack exchange,提问作者BarYaron
相关产品推荐
相关产品推荐

