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

使用cJSON解析字符串形式JSON数组,获取元素数量为0求解决方法

解决cJSON解析嵌套字符串JSON数组的问题

问题核心是你拿到的permissions节点是字符串类型,而非直接的JSON数组——主JSON里这个字段的值被双引号包裹,解析后它只是一串文本,不是cJSON能识别的数组结构,直接调用cJSON_GetArraySize自然返回0。

正确处理步骤:

  • 先提取该节点的字符串内容
  • 将字符串重新解析为cJSON数组对象
  • 再对新的数组对象执行常规操作

完整代码示例:

// 获取permissions字符串节点
cJSON *permissions_str = cJSON_GetObjectItem(json, "permissions");
if (permissions_str == NULL || !cJSON_IsString(permissions_str)) {
    // 错误处理:节点不存在或非字符串类型
    return;
}

// 将字符串解析为新的cJSON数组
cJSON *permissions_array = cJSON_Parse(permissions_str->valuestring);
if (permissions_array == NULL || !cJSON_IsArray(permissions_array)) {
    // 错误处理:解析失败或结果非数组
    return;
}

// 正常操作数组
int npermissions = cJSON_GetArraySize(permissions_array);
printf("number of permissions: %d\n", npermissions);

// 遍历数组元素示例
for (int i = 0; i < npermissions; i++) {
    cJSON *item = cJSON_GetArrayItem(permissions_array, i);
    if (item == NULL) continue;
    
    cJSON *email = cJSON_GetObjectItem(item, "emailAddress");
    cJSON *role = cJSON_GetObjectItem(item, "role");
    if (email && cJSON_IsString(email) && role && cJSON_IsString(role)) {
        printf("User: %s, Role: %s\n", email->valuestring, role->valuestring);
    }
}

// 释放新解析的数组对象,避免内存泄漏
cJSON_Delete(permissions_array);

注意事项:

  • 必须检查每个节点的类型,避免空指针或类型错误导致崩溃
  • 调用cJSON_Parse后务必用cJSON_Delete释放内存,防止内存泄漏

内容的提问来源于stack exchange,提问作者Jeff McKay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:35:08