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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:35:22