用过很多次cJson库,都是比较简单的使用,而且每次用了都会忘记,只能去翻曾经写过的代码或是重新到网上查找下,今天在这里记录下曾经有用到过的json数据的拼装和解析。
至于什么是JSON和C语言库在哪查找,不懂的可以自行百度。
json数据拼装
简单结构
#include "stdafx.h" #include "cJson.h" #include <stdlib.h> int _tmain(int argc,_TCHAR* argv[]) { cJSON * pJsonRoot; pJsonRoot = cJSON_CreateObject(); if (pJsonRoot == NULL){ return -1; } cJSON_AddStringToObject(pJsonRoot,"number","0001");/* 增加字符串数据 */ cJSON_AddStringToObject(pJsonRoot,"name","张三"); cJSON_AddStringToObject(pJsonRoot,"class","140412"); cJSON_AddNumberToObject(pJsonRoot,"score",90);/* 增加整型数据 */ char *szJson = cJSON_Print(pJsonRoot);/* 将json结构转换为字符串 */ if (szJson != NULL){ printf("%s\n",szJson); free(szJson);/* 需要释放 */ } cJSON_Delete(pJsonRoot);/* 释放资源 */ return 0; }
运行结果如图所示:
数组与嵌套
有时候我们需要用一个Json数据结构来显示一个班级信息,需要保存班级的每个学生信息,类似于:
{“class”: “140412” [ {“number”:“14041201”, “name”:“张三”}, {“number”:“14041202”, “name”:“李四”}, {“number”:“14041203”, “name”:“王五”} .... ] }这就需要用到json数组了, 我们先来实现一个json数组,存储0-9这几个数字,然后打印,代码如下:
#include "stdafx.h" #include "cJson.h" #include <stdlib.h> int _tmain(int argc,_TCHAR* argv[]) { cJSON * pJsonRoot; pJsonRoot = cJSON_CreateArray(); if (pJsonRoot == NULL){ return -1; } for (int i = 0; i < 10; i++){ cJSON_AddNumberToObject(pJsonRoot,"",i); } char *szJson = cJSON_Print(pJsonRoot);/* 将json结构转换为字符串 */ if (szJson != NULL){ printf("%s\n",szJson); free(szJson);/* 需要释放 */ } cJSON_Delete(pJsonRoot);/* 释放资源 */ return 0; }运行结果如下图:
上述的结果显然是不能满足我们保存一个班级的所有学生信息,因为学生有诸如学号、姓名等多个属性,如果我们用json来实现的话数组里面装的应该是cJSON对象,这就涉及到对象的嵌套了,其实JSON对象的嵌套是很简单的,直接用 cJSON_AddItemToObject()函数将一个对象加进来即可,实现保存学生信息的数组简要代码如下:
#include "stdafx.h" #include "cJson.h" #include <stdlib.h> int _tmain(int argc,_TCHAR* argv[]) { cJSON * pJsonRoot; pJsonRoot = cJSON_CreateArray(); if (pJsonRoot == NULL){ return -1; } char *szNumArray[] = { "0001","0002","0003","0004" }; char *szNameArray[] = { "张三","李四","王五","赵六" }; for (int i = 0; i < _countof(szNameArray); i++){ cJSON *pItem = cJSON_CreateObject();/* 创建一个子Json对象 */ cJSON_AddStringToObject(pItem,szNumArray[i]); cJSON_AddStringToObject(pItem,szNameArray[i]); cJSON_AddItemToObject(pJsonRoot,pItem); } char *szJson = cJSON_Print(pJsonRoot);/* 将json结构转换为字符串 */ if (szJson != NULL){ printf("%s\n",szJson); free(szJson);/* 需要释放 */ } cJSON_Delete(pJsonRoot);/* 释放资源 */ return 0; }运行结果:
#include "stdafx.h" #include "cJson.h" #include <stdlib.h> int _tmain(int argc,_TCHAR* argv[]) { cJSON *pClassRoot; cJSON * pJsonRoot; pClassRoot = cJSON_CreateObject(); if (pClassRoot == NULL){ return -1; } cJSON_AddStringToObject(pClassRoot,"10000"); pJsonRoot = cJSON_CreateArray(); if (pJsonRoot == NULL){ cJSON_Delete(pClassRoot);/* 释放资源 */ return -1; } char *szNumArray[] = { "0001",pItem); } cJSON_AddItemToObject(pClassRoot,"student",pJsonRoot); char *szJson = cJSON_Print(pClassRoot);/* 将json结构转换为字符串 */ if (szJson != NULL){ printf("%s\n",szJson); free(szJson);/* 需要释放 */ } cJSON_Delete(pClassRoot);/* 释放资源 */ return 0; }运行结果:
json数据解析
/* 解析 */ cJSON *pParseRoot = cJSON_Parse(szJson);/* 将字符串格式的JSON数据转化为JSON数据结构 */ if (pParseRoot == NULL){ return -1; } cJSON *pClass = cJSON_GetObjectItem(pParseRoot,"class");/* 获取班级的对象 */ printf("class=%s\n",pClass->valuestring);/* 打印班级信息,如果是整型就用pClass->valueint */ cJSON *pArray = cJSON_GetObjectItem(pParseRoot,"student"); int nCount = cJSON_GetArraySize(pArray);/* 获取JSON数组大小 */ for (int i = 0; i < nCount; i++){ cJSON *pStudent = cJSON_GetArrayItem(pArray,i); cJSON * pNum = cJSON_GetObjectItem(pStudent,"number"); cJSON * pName = cJSON_GetObjectItem(pStudent,"name"); printf("number=%s name=%s\n",pNum->valuestring,pName->valuestring); } cJSON_Delete(pParseRoot);