JSON&cJSON

JSON是一种开放的、轻量级的数据交换格式,采用独立于编程语言的文本格式(字
符串)来存储和表示数据,JSON数据以键-值对的形式组织,可以包含对象、数组、字符
串、数字、布尔、NULL这6种基本数据类型。

使用cJSON保函#include "cJSON.h"

其中\为转义字符

使用cJSON对JSON字符进行解析

1.解析JSON

cJSON* js_root = cJSoN_Parse(json_str);

2.获取id键值对里面的值

cJSON * id_js = cJSON_GetObjectItem(js_root,"id");
ESP_LOGI(TAG,"id:%s",cJSON_GetStringValue(id_js));

cJSON * id_js = cJSON_GetObjectItem(js_root,"id")的含义为从js_root中提取键名为"id"的数据,提取后的值为cJSON格式保存在id_js中,
ESP_LOGI(TAG,"id:%s",cJSON_GetStringValue(id_js));为将提取的cJson类型的数值转换为字符串并打印

3.version

cJSoN* version_js = cJsoN_GetobjectItem(js_root,"version");
ESP_LOGI(TAG,"version:%s",cJSoN_GetStringValue(version_js));

4.sys

cJSoN* sys_js = cJSoN_GetobjectItem(js_root,"sys");
cJSON* ack_js = cJSON_GetObjectItem(sys_js,"ack");
ESP_LOGI(TAG,"ack:%s",cJSON_GetStringValue(aCk_js));

5.params

cJSoN* params_js = cJsoN_GetobjectItem(js_root,"params");
cJSoN* power_js = cJSoN_GetObjectItem(params_js,"power");
cJSoN* value_js = cJSoN_GetObjectItem(power_js,"value");
cJSON* time_js = cJsoN_GetobjectItem(power_js,"time");
ESP_LOGI(TAG,"value:%s",cJSON_GetStringValue(value_js));
ESP_LOGI(TAG,"time:%.1lf",cJSON_GetNumberValue(time_js));

6.method

cJSoN* method_js = cJSoN_GetObjectItem(js_root,"method");
ESP_LOGI(TAG,"method:%s",cJSON_GetStringValue(method_js));

7.数组

cJSoN* array_js = cJSoN_GetobjectItem(js_root,"array");
cJSON* sub_js = array_js->child;
int num =0;
while(sub_js)
ESP_LOGI(TAG,"array[%d]:%s",num,cJSON_GetStringValue(sub_js));
sub_js = sub_js->next;
num++;

8.释放CJSON

cJSON_Delete(js_root);

生成JSON字符串

1.生成JSON对象

cJSON * js_root =cJSON_CreatObject();

2.id

cJSON_AddStringToObject(js_root,"id","123");

3.version

cJSON_AddStringToObject(js_root,"version","1.0");

4.sys

cJSON*sys_js= cJSON_CreateObject();
cJSON_AddNumberToObject(sys_js,"ack",1.0);
cJSoN_AddItemToObject(js_root,"sys",sys_js);

5.params

cJSoN *params_js = cJSoN_Createobject();
cJSON *power_js = cJSoN_CreateObject();
cJSoN_AddStringToObject(power_js,"value","on");
cJSoN_AddStringToobject(power_js,"time",1524448722000);
cJSoN_AddItemToObject(params_js,"Power",power_js);
cJSoN_AddItemToObject(js_root,"Params",params_js);

6.array数组

cJSON* array_js = cJSON_CreateArray();
cJSoN_AddItemToArray(array_js,cJSoN_CreateString("string1"));
cJSoN_AddItemToArray(array_js,cJSoN_CreateString("string2"));
cJSoN_AddItemToArray(array_js,cJSoN_CreateString("string3"));
cJSoN_AddItemToObject(js_root,"array",array_js);

7.打印创建的JSON

char* js_str = cJsoN_PrintUnformatted(js_root);
//char* js_str =cJSON_Print(js_root);
ESP_LOGI(TAG,"js:\r(n:%s",js_str);

8.释放内存

cJSON_free(js_str);
cJSON_Delete(js_root);

<think>好的,我需要解释用户给出的C语言中的if条件判断语句:id_json && Targt_json && Targt_json->type == cJSON_Number。首先,我应该分解每个部分,说明各个运算符的作用整个表达式的逻辑流程。 用户可能不太熟悉C语言的逻辑运算符结构体指针的访问方式,因此需要逐步解释。首先,解释&&运算符的短路特性,然后分别说明每个条件的作用。比如,id_json可能是一个指针,检查它是否为非NULL;同理Targt_json是否为非NULL。接着,检查Targt_json的type成员是否等于cJSON_Number这个枚举值。 还需要注意用户提到的cJSON库,可能需要简要介绍cJSON的结构,特别是type字段的常见取值,如cJSON_Number、cJSON_String等,以帮助理解这个条件判断的目的。例如,这段代码可能在处理JSON对象时,确保相关的JSON节点存在并且类型正确,避免解引用NULL指针或类型不匹配导致的错误。 另外,用户提到想理解代码逻辑,可能需要举一个例子,说明在何种情况下这个条件成立,比如当id_jsonTargt_json都有效,且目标JSON节点的类型是数字时,才会执行if块内的代码。同时,应该强调这种检查的重要性,尤其是在处理动态数据或外部输入时,防止程序崩溃或未定义行为。 最后,生成的相关问题需要围绕条件判断、cJSON库的使用、指针检查等方面,帮助用户进一步巩固知识,比如如何避免空指针解引用,cJSON中不同类型节点的处理,或者条件判断中的常见错误等。</think>### 分步解释条件判断逻辑 此条件判断语句`id_json && Targt_json && Targt_json->type == cJSON_Number`是C语言中典型的指针有效性检查与数据属性验证的组合逻辑,具体含义如下: #### 1. **短路逻辑与`&&`的特性** - `&&`运算符按从左到右顺序执行,若左操作数为假则直接跳过右侧计算[^1] - 该特性常用于指针有效性检查,避免解引用空指针导致的段错误 #### 2. **逐项解析条件** - **`id_json`** 验证指针是否非空,通常表示该指针指向某个JSON对象节点 - **`Targt_json`** 二次指针有效性检查,确保后续成员访问的安全性 - **`Targt_json->type == cJSON_Number`** 验证目标JSON节点的类型字段是否为数值类型(需结合cJSON库定义) #### 3. **组合逻辑流程图** ```mermaid graph TD A[条件判断开始] --> B{id_json有效?} B -->|否| C[返回false] B -->|是| D{Targt_json有效?} D -->|否| C D -->|是| E{type是数值类型?} E -->|否| C E -->|是| F[返回true] ``` #### 4. **cJSON类型说明** cJSON库定义的类型常量包括: ```c #define cJSON_Number 0x0004 // 数值类型 #define cJSON_String 0x0008 // 字符串类型 #define cJSON_Array 0x0002 // 数组类型 // ...其他类型定义 ``` ### 典型应用场景 此条件判断常见于JSON数据处理场景,例如: ```c if(id_json && Targt_json && Targt_json->type == cJSON_Number) { double value = Targt_json->valuedouble; // 安全读取数值 // 处理业务逻辑... } ``` 该代码确保在访问`Targt_json->valuedouble`之前满足: 1. 关联的JSON对象存在 2. 目标节点有效 3. 数据类型匹配数值类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值