如何使用cJSON从嵌套JSON中根据id提取对应UUID
基于cJSON根据指定id获取对应UUID的解析方法
前提说明
假设你的嵌套JSON结构类似如下(若实际结构不同,可对应调整字段名):
{ "connections": [ { "id": "PSK", "UUID": "8284b1b8-a268-4a99-88e4-fdf35f6badb0" }, { "id": "WPA", "UUID": "12345678-aaaa-bbbb-cccc-1234567890ab" } ] }
核心问题分析
你之前的代码只获取了connections字段,但connections是JSON数组而非单个对象,必须遍历数组内的每个元素,逐个匹配id字段才能找到对应UUID。
具体实现代码
#include <stdio.h> #include <string.h> #include <cJSON.h> // 根据目标id从JSON中提取对应UUID const char* getUUIDById(cJSON* root, const char* targetId) { // 取出connections数组 cJSON* connectionsArray = cJSON_GetObjectItem(root, "connections"); if (!connectionsArray || !cJSON_IsArray(connectionsArray)) { printf("connections字段不存在或不是数组类型\n"); return NULL; } // 遍历数组中的每个对象 cJSON* currentItem = NULL; cJSON_ArrayForEach(currentItem, connectionsArray) { // 获取当前对象的id字段 cJSON* idField = cJSON_GetObjectItem(currentItem, "id"); if (idField && cJSON_IsString(idField) && strcmp(idField->valuestring, targetId) == 0) { // 匹配到目标id,取出对应的UUID cJSON* uuidField = cJSON_GetObjectItem(currentItem, "UUID"); if (uuidField && cJSON_IsString(uuidField)) { return uuidField->valuestring; } else { printf("匹配id对应的UUID字段不存在或不是字符串\n"); return NULL; } } } printf("未找到目标id对应的条目\n"); return NULL; } // 测试示例 int main() { const char* sampleJson = "{\"connections\":[{\"id\":\"PSK\",\"UUID\":\"8284b1b8-a268-4a99-88e4-fdf35f6badb0\"},{\"id\":\"WPA\",\"UUID\":\"12345678-aaaa-bbbb-cccc-1234567890ab\"}]}"; // 解析JSON字符串 cJSON* root = cJSON_Parse(sampleJson); if (!root) { printf("JSON解析失败: %s\n", cJSON_GetErrorPtr()); return 1; } // 获取PSK对应的UUID并打印 const char* targetUUID = getUUIDById(root, "PSK"); if (targetUUID) { printf("PSK对应的UUID: %s\n", targetUUID); } // 释放cJSON内存 cJSON_Delete(root); return 0; }
关键注意事项
- 必须校验字段类型:比如确认
connections是数组、id和UUID是字符串,避免因JSON结构异常导致程序崩溃 - 使用
cJSON_ArrayForEach宏遍历数组,这是cJSON官方推荐的安全遍历方式 - 解析完成后务必调用
cJSON_Delete释放整个JSON对象树,防止内存泄漏
内容的提问来源于stack exchange,提问作者nagaveni
相关产品推荐
相关产品推荐

