You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JsonCPP抛出logic error: requires objectValue or nullValue问题排查

错误原因
  1. JsonCPP的isMember()方法仅支持**对象类型(objectValue)**调用,作用是查询对象中是否存在指定键名。上层m_root.isMember(a)未报错,是因为m_root本身为对象类型,符合方法调用要求。
  2. 第一次传入a="hey"时,代码进入else分支,将m_root["hey"]设置为数组类型(arrayValue)。第四次调用时a="hey"已存在,进入第一个if分支后,代码对数组类型的m_root[a]调用isMember(),触发类型不匹配错误。
  3. 原有逻辑本身存在设计错误:即使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:45:01