使用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
相关产品推荐
相关产品推荐

