关于cJSON的小坑

ESP32空中升级失败时,可能与cJSON处理JSON数据有关。在尝试从阿里云OTA下发的JSON数据中提取URL时,发现cJSON_Print(item)返回的字符串带有额外的双引号,直接使用会导致错误。需去除这些引号才能正确传递参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于cJSON的小坑

esp32空中升级, 如果失败返回 HTTP_CLIENT: Error parse urlHTTP_CLIENT: Failed to set URL,而且感觉传入的URL没有错误的话,可能这里出错了。
利用Cjson截取json里的url,我这里想截取的是阿里云ota下发的Json格式数据里的url

        cJSON* root = NULL;
        cJSON* item = NULL;//cjson对象
        root = cJSON_Parse(p_event->data);
        
### CJSON库的使用方法 #### 创建和操作JSON对象 在C语言中,`cJSON`库提供了简便的方法来处理JSON数据。通过该库可以轻松实现JSON对象的创建、插入、解析、修改以及删除等功能[^1]。 为了构建一个新的JSON对象,通常会调用`cJSON_CreateObject()`函数。此函数返回指向新分配的对象指针,之后可以通过这个指针向其中添加键值对[^3]。 对于字符串类型的成员来说,可利用`cJSON_AddStringToObject()`来进行设置;而数值型的数据则适用`cJSON_AddNumberToObject()`. 这些都是用于给已存在的JSON对象增加新的字段的方式之一[^4]。 当完成所有必要的配置后,如果想要查看最终形成的JSON串,则应该采用`cJSON_PrintUnformatted()`或带格式化的版本`cJSON_Print()`将整个树状结构转换成易于阅读的文字表示形式。 下面是一段简单的示例代码展示了如何使用上述提到的功能: ```c #include <stdio.h> #include "cjson/cJSON.h" int main(void){ // 创建根节点作为容器 cJSON *root = cJSON_CreateObject(); // 向根节点内加入名为"name", 值为"John Doe" 的字符串项 cJSON_AddStringToObject(root, "name", "John Doe"); // 添加年龄信息到根节点下 cJSON_AddNumberToObject(root, "age", 30); // 将生成好的JSON转为字符并输出至屏幕 char *out = cJSON_Print(root); printf("%s\n", out); // 清理内存资源 free(out); cJSON_Delete(root); } ``` 这段程序首先引入了必要的头文件,并定义了一个入口函数main(). 接着初始化了一个空的JSON对象实例化变量root. 随即分别加入了两个不同的属性——姓名(name) 和 年龄(age),最后把得到的结果打印出来供观察者查阅. #### 解析现有JSON文档 除了能够方便地制造自定义的内容外,`cJSON_Parse()`允许开发者读取外部传入的JSON文本流,并将其转化为内部使用的链表式存储模型以便进一步访问各个组成部分的信息[^2]. 假设有一个预先准备好了的标准JSON字符串如下所示: ```json { "city": "Beijing", "population": 21540000, "coordinates": { "latitude": 39.9042, "longitude": 116.4074 } } ``` 那么就可以按照以下方式加载它进入应用程序当中去分析其具体内容: ```c const char* json_string = "{\"city\":\"Beijing\",\"population\":21540000,\"coordinates\":{\"latitude\":39.9042,\"longitude\":116.4074}}"; cJSON *parsed_json = cJSON_Parse(json_string); if (parsed_json != NULL) { const char *city_name = cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(parsed_json, "city")); double population = cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(parsed_json, "population")); printf("City Name: %s\nPopulation: %.f\n", city_name, population); cJSON_Delete(parsed_json); } else { fprintf(stderr,"Error before: [%s]\n", cJSON_GetErrorPtr()); } ``` 这里先声明了一条常量级别的JSON描述符,接着借助于`cJSON_Parse()`尝试把它变成一个可供查询的对象。一旦成功获取到了有效的句柄(即非NULL),便能安全地从中提取特定路径下的子元素直至最底层为止.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值