官方网站建设合同,编程软件自学网,用网站做邮箱,软件app制作一、前言 我们前面OpenHarmony设备配网 文章中#xff0c;给大家提供的示例有使用cJSON解析和cJSON创建json数据的用法 那么有同学会提出疑问#xff0c;我难道只能用cJSON库#xff1f; 当然不是啊#xff0c;你也可以用 json-parser、parson、jansson 等等三方库 回到正题…一、前言 我们前面OpenHarmony设备配网 文章中给大家提供的示例有使用cJSON解析和cJSON创建json数据的用法 那么有同学会提出疑问我难道只能用cJSON库 当然不是啊你也可以用 json-parser、parson、jansson 等等三方库 回到正题我们如何在OpenHarmony中灵活熟练的使用cJSON库呢
如果对JSON本身就不懂的别急我们先带大家理解JSON然后再去深入学习cJSON库的使用。
二、JSON理解 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON采用完全独立于语言的文本格式但是也使用了类似于C语言家族的习惯包括C, C, C#, Java, JavaScript, Perl, Python等 这些特性使JSON成为理想的数据交换语言。 我们可以在Be JSON中随便输入一个内容查看报错的提示 我们能看到期望的是如下格式的数据 字符串、数字Number、NULL、BOOL、Json对象、Json数组这些格式的数据 那么我们在JSON中常用的有(Json对象、Json数组) 2种数据格式
Json对象Json数组1、Json对象 Json对象使用的是 { } 来描述每个 Json 对象中都可以存储若干个元素每一个元素都对应一个键值对keyvalue 结构元素和元素之间使用逗号间隔 key必须是字符串value值类型可选如字符串、数字、Boolean、NULL、Json对象、Json数组 {count: 100,flag: true,paras: {Light: ON,Motor: OFF}
}2、Json数组 Json数组使用的是 [ ] 来描述[ ]里面的元素和元素之间使用逗号间隔支持的数据类型字符串、数字、Boolean、NULL、Json对象、Json数组 // 整形
[996,2399,1999,6999]
// 字符串
[张三, 李四, 王二, 麻子]
// 混合使用
[111, 9.99, true, false, 交个朋友, null]
// 数组嵌套数组使用用逗号分隔
[[张三, 李四, 王二, 麻子],[111, 9.99, true, false, 兄弟们支持了吗, null]
]
// 数组嵌套对象
[{king: {child: [张三, 李四, 王二, 麻子]}},[111, 9.99, true, false, 你好陌生人, null]
]三、cJSON详解
有了上面的知识来看cJSON会发现其实也很简单没有那么难只需要知道对应方法的含义和如何使用它就能解决开发中遇到的问题了。
我们看cJSON数据结构如下
/* The cJSON structure: */
typedef struct cJSON
{struct cJSON *next;struct cJSON *prev;struct cJSON *child;int type;char *valuestring;/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */int valueint;double valuedouble;char *string;
} cJSON;char *string表示对象中的key int type用于描述数据元素的类型type一共定义了 7种 类型。 如果获取的类型是Number类型使用valueint 如果获取的类型是double类型使用valuedouble 如果获取的类型是string类型使用valuestring 我们可以通过如下方法去检查type类型 大家看一下源码中就是通过这种方式去判断type类型然后去获取最终的数据值的
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item)
{if (!cJSON_IsString(item)) {return NULL;}return item-valuestring;
}
...
CJSON_PUBLIC(double) cJSON_GetNumberValue(cJSON *item)
{if (!cJSON_IsNumber(item)) {return NAN;}return item-valuedouble;
}1、如何创建一个JSON对象 带着问题去看源码并寻找解决答案 // cJSON.h
/* These calls create a cJSON item of the appropriate type. */
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
/* raw json */
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);我们刚刚在上面介绍JSON的时候知道JSON可以是如下几种类型的 字符串、数字Number、NULL、BOOL、Json对象、Json数组 所以我们可以通过cJSON_Create... 来创建JSON对象。
那么创建完JSON对象之后如何添加键值对呢
// cJSON.h
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);我们看下面这样的json应该如何使用cJSON?
{pi: 3.141,happy: true,name: 头戴三叉束发紫金冠体挂西川红棉百花袍身披兽面吞头连环铠腰系勒甲玲珑狮蛮带手持方天画戟坐下嘶风赤兔马之吕小布是也
}使用方式
int main()
{cJSON * root;// 创建根数据对象rootcJSON_CreateObject();// 添加键值对cJSON_AddBoolToObject(root,happy,true);cJSON_AddNumberToObject(root,pi,3.141);cJSON_AddNumberToObject(root,name,头戴三叉束发紫金冠体挂西川红棉百花袍身披兽面吞头连环铠腰系勒甲玲珑狮蛮带手持方天画戟坐下嘶风赤兔马之吕小布是也); // 将json形式转换成字符串char *out cJSON_Print(root);printf(%s\n,out);// 释放内存如果不删除会出现内存泄漏cJSON_Delete(root); free(out);
}2、如何创建一个JSON数组
看完上面的内容我们应该知道应该用的是cJSON_CreateArray对吧。
假如我们有如下json内容
[111, 9.99, true, false, 交个朋友, null]使用方式
int main()
{cJSON *root;root cJSON_CreateArray();cJSON_AddItemToArray(root, cJSON_CreateNumber(111)); cJSON_AddItemToArray(root, cJSON_CreateNumber(9.99)); cJSON_AddItemToArray(root, cJSON_CreateBool(true)); cJSON_AddItemToArray(root, cJSON_CreateBool(false)); cJSON_AddItemToArray(root, cJSON_CreateString(交个朋友));cJSON_AddItemToArray(root, cJSON_CreateNull());char *s cJSON_PrintUnformatted(root);if(s){printf( %s \n,s);free(s);}// 必须要删除否则会出现内存泄漏cJSON_Delete(root);return 0;
}3、如何创建一个JSON对象嵌套数组
{test:[{name:雷布斯,motto:碉堡了友商是傻瓜}]
}使用方式
int main()
{cJSON *root, *body, *list;// json对象rootroot cJSON_CreateObject();// root 添加键值对test:json数组AcJSON_AddItemToObject(root,test, body cJSON_CreateArray());// json数组A添加Json对象BcJSON_AddItemToArray(body, list cJSON_CreateObject());// 在json对象B中添加键值对cJSON_AddStringToObject(list,name,雷布斯);// 在json对象B中添加键值对cJSON_AddNumberToObject(list,motto,碉堡了友商是傻瓜);char *s cJSON_PrintUnformatted(root);if(s){printf(%s \n,s);free(s);}if(root){// 必须要删除否则会出现内存泄漏cJSON_Delete(root); }return 0;
}4、如何解析json?
// cJSON.h
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);将字符串转换为 cJSON 结构体 这里我们拿复杂的嵌套数据来讲解json对象嵌套数组如何解析呢
{list: [{day: 1,money: -1999999}, {day: 10,money: 1999999}]
}我们看到最外层是一个JSONObject 然后通过 key: list 获取JSONArray JSONArray里面有2个JSONObject 然后通过 key: happy 、key: money 获取对应的值 int main()
{char *s {\list\:[{\day\:1,\money\:-1999999},{\day\:10,\money\:1999999}]};cJSON *root cJSON_Parse(s);if(!root) {printf(cJSON_Parse失败 !\n);return -1;}cJSON *list cJSON_GetObjectItem(root, list);if(!list){printf(没有发现key为list的Item!\n);return -1;}// 这里我们需要获取数组的大小int array_size cJSON_GetArraySize(list);printf(数组大小%d\n,array_size);for(int i0; i array_size; i) {// 获取JSONArraycJSON* item cJSON_GetArrayItem(list, i);cJSON* day cJSON_GetObjectItem(item, day);printf(day is %d\n,day-valueint);cJSON* money cJSON_GetObjectItem(item, money);printf(money is %d\n,money-valueint);}if(root){// 删除JSON并释放内存cJSON_Delete(root);}return 0;
}四、注意事项
刚刚上面我们介绍了如何通过cJSON库创建JSON以及如何解析JSON。
那么我们在cJSON解析数据的时候一定要做数据健全性检查。
例如我们刚写了下面2行代码
cJSON *recvJson cJSON_Parse(recvBuf);
cJSON *testID cJSON_GetObjectItem(recvJson, test_id);
...我们这个时候能直接用testID吗 肯定不能我们需要检查一下它是否存在可增加如下代码进行判断
if(testID NULL || testID-type cJSON_NULL)
{ printf(JSON数据有问题\r\n);
}
else
{ // 这里做正常的业务处理...
}这个时候可能有同学会疑问了cJSON里面没有方法判断吗
肯定有啊请使用 cJSON_HasObjectItem
if(1 cJSON_HasObjectItem(json,test_id))
{// 这里做正常的业务处理
}
else
{printf(JSON数据有问题\r\n);
}那么我们这个时候假设使用的是 testID-valuestring 获取内容需要判断是否和本地的一个字符串值 雷布斯 是否相等我们应该如何做呢
我们可以使用 strcmp 来比较2个数据值是否相等
if (strcmp(testIDValue, 雷布斯) 0)
{ // 这里判断2个数据值相等这个分支里面写我们的业务代码...
}
文章转载自: http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.mnclk.cn.gov.cn.mnclk.cn http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.wcgfy.cn.gov.cn.wcgfy.cn http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn http://www.morning.gwwky.cn.gov.cn.gwwky.cn http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.pmysp.cn.gov.cn.pmysp.cn http://www.morning.ppdr.cn.gov.cn.ppdr.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn http://www.morning.nzms.cn.gov.cn.nzms.cn http://www.morning.sfhjx.cn.gov.cn.sfhjx.cn http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn http://www.morning.ftznb.cn.gov.cn.ftznb.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.qsswb.cn.gov.cn.qsswb.cn http://www.morning.ncrk.cn.gov.cn.ncrk.cn http://www.morning.msbmp.cn.gov.cn.msbmp.cn http://www.morning.kuaijili.cn.gov.cn.kuaijili.cn http://www.morning.dzgyr.cn.gov.cn.dzgyr.cn http://www.morning.wrcgy.cn.gov.cn.wrcgy.cn http://www.morning.pqbkk.cn.gov.cn.pqbkk.cn http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.kntsd.cn.gov.cn.kntsd.cn http://www.morning.lsnbx.cn.gov.cn.lsnbx.cn http://www.morning.rgrys.cn.gov.cn.rgrys.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.kfsfm.cn.gov.cn.kfsfm.cn http://www.morning.ho-use.cn.gov.cn.ho-use.cn http://www.morning.tqlhn.cn.gov.cn.tqlhn.cn http://www.morning.nytgk.cn.gov.cn.nytgk.cn http://www.morning.ztrht.cn.gov.cn.ztrht.cn http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn http://www.morning.jpydf.cn.gov.cn.jpydf.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.nqcts.cn.gov.cn.nqcts.cn http://www.morning.gwwky.cn.gov.cn.gwwky.cn http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn http://www.morning.ngznq.cn.gov.cn.ngznq.cn http://www.morning.clybn.cn.gov.cn.clybn.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.ckhyj.cn.gov.cn.ckhyj.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.nqrfd.cn.gov.cn.nqrfd.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.wjlkz.cn.gov.cn.wjlkz.cn http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn http://www.morning.qcwck.cn.gov.cn.qcwck.cn http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn http://www.morning.fgxr.cn.gov.cn.fgxr.cn http://www.morning.wqgr.cn.gov.cn.wqgr.cn http://www.morning.bnlch.cn.gov.cn.bnlch.cn http://www.morning.myzfz.com.gov.cn.myzfz.com http://www.morning.trrpb.cn.gov.cn.trrpb.cn http://www.morning.yrpd.cn.gov.cn.yrpd.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.cnwpb.cn.gov.cn.cnwpb.cn http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.cyjjp.cn.gov.cn.cyjjp.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.huxinzuche.cn.gov.cn.huxinzuche.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn