1,解析对象
接下来,我们来个复杂一点的,解析一个对象,要解析的目标如下:
{ "student": { "name":"maye", "age":18, "email":"zcmaye@gmail.com", "isMarried":false } }
看起来比一个键值对复杂多了,我们又需要学习新的接口函数了吗?为了更严谨,我们对key的类型进行判断即可,其他的一样。
void parserObject(const char* json) { //1,将json数据解析成为cjson对象 cJSON*root = cJSON_Parse(json); //2,调用cJSON_GetObjectItem()函数,获取到对象student cJSON* objItem = cJSON_GetObjectItem(root,"student"); if (cJSON_IsObject(objItem)) //如果查找到的确实是个对象,不是其他(比如字符串,值...) { //对我们刚取出来的对象student,多次调用cJSON_GetObjectItem()函数,来获取对象的成员。此时要注意,不同的成员,访问的方法不一样: cJSON* item = NULL; item = cJSON_GetObjectItem(objItem, "name"); printf("name:%s\n", cJSON_GetStringValue(item)); item = cJSON_GetObjectItem(objItem, "age"); printf("age:%d\n",(int)cJSON_GetNumberValue(item)); item = cJSON_GetObjectItem(objItem, "email"); printf("name:%s\n", item->valuestring/*cJSON_GetStringValue(item)*/); item = cJSON_GetObjectItem(objItem, "isMarried"); //下面if中两种方法都可判断bool类型的值 if (cJSON_IsTrue(item) || item->type == cJSON_True) { printf("isMarried:%s\n","true"); } else { printf("isMarried:%s\n", "false"); } } cJSON_Delete(root); }
结果:
2,解析数组
最后,我们来个更复杂一些的,来解析一个数组,数组的成员是对象!要解析的JSON串如下:
{ "students": [ { "name":"maye", "age" : 18, "email" : "zcmaye@gmail.com", "isMarried" : false }, { "name":"顽石", "age" : 20, "email" : "xxxx@gmail.com", "isMarried" : false }, { "name":"jack", "age" : 26, "email" : "jack@qq.com", "isMarried" : true } ] }
此时,我们又需要学习新的接口了,一个是获取数组长度,一个是取数组成员,函数原型如下:
int cJSON_GetArraySize(cJSON *array); cJSON*cJSON_GetArrayItem(cJSON *array,int item);
//解析student对象 void parserStudent(cJSON* item) { if (!cJSON_IsObject(item)) return; cJSON* subitem = NULL; subitem = cJSON_GetObjectItem(item, "name"); printf("name:%s\n", cJSON_GetStringValue(subitem)); subitem = cJSON_GetObjectItem(item, "age"); printf("age:%d\n", (int)cJSON_GetNumberValue(subitem)); subitem = cJSON_GetObjectItem(item, "email"); printf("name:%s\n", subitem->valuestring/*cJSON_GetStringValue(subitem)*/); subitem = cJSON_GetObjectItem(item, "isMarried"); //下面if中两种方法都可判断bool类型的值 if (cJSON_IsTrue(subitem) || subitem->type == cJSON_True) { printf("isMarried:%s\n", "true"); } else { printf("isMarried:%s\n", "false"); } } //解析数组 void parserArray(const char* json) { cJSON* root = cJSON_Parse(json); cJSON* arrayitem = cJSON_GetObjectItem(root, "students"); if (cJSON_IsArray(arrayitem)) { //获取数组大小 int len = cJSON_GetArraySize(arrayitem); //遍历数组的每个元素 for (int i = 0; i < len; i++) { cJSON* item = cJSON_GetArrayItem(arrayitem, i); //解析数组的每个元素 printf("\n%d student obj\n",i); parserStudent(item); } } cJSON_Delete(root); }
结果:
cJSON解析对象和数组的内容就到这啦~接下来会为大家带来更多cJSON库使用技巧,喜欢的不如点个“在看”吧