cJSON是一个仅有一个.h文件,一个.c文件组成的JSON解析器,它是由纯C(ANSI C89)实现的,跨平台性较好。cJSON是采用链表存储的。
表示:
以"{“开始,以”}"结束
数据在键/值对中;
数据由逗号分开;
花括号保存对象;
方括号保存数组;
JSON两种结构:
对象:对象在js中表示为“{}”括起来的内容,数据结构为{key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值.
数组:数组在js中是中括号“[]”括起来的内容,数据结构为[“java”,“javascript”,“vb”,…],取值方式和所有语言中一样,使用索引获取。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#pragma comment(lib,"cjson.lib")
#include "cJson/include/cJSON.h"
void Inspect(char* OutBuf)
{
/* 创建一个JSON数据对象(链表头结点) */
cJSON *cjson_root = cJSON_CreateObject();
/* 添加一条字符串类型的JSON数据(添加一个链表节点) */
cJSON_AddStringToObject(cjson_root, "Dev", "设备1");
/* 添加一条整数类型的JSON数据(添加一个链表节点) */
//cJSON_AddNumberToObject(cjson_test, "age", 22);
cJSON_AddStringToObject(cjson_root, "Side", "Front");
cJSON* ObjFirst = cJSON_CreateObject();
cJSON_AddStringToObject(ObjFirst, "name", "极耳宽度");
cJSON_AddNumberToObject(ObjFirst, "number1", 5);
cJSON_AddNumberToObject(ObjFirst, "number2", 6);
cJSON* ObjScnd = cJSON_CreateObject();
cJSON_AddStringToObject(ObjScnd, "name", "陶瓷高度");
cJSON_AddNumberToObject(ObjScnd, "number1", 2);
cJSON_AddNumberToObject(ObjScnd, "number2", 3);
//把对象添加到数组
cJSON* ObjArr = cJSON_CreateArray();
cJSON_AddItemToArray(ObjArr, ObjFirst);
cJSON_AddItemToArray(ObjArr, ObjScnd);
cJSON_AddItemToObject(cjson_root, "Type", ObjArr);
/* 打印JSON对象(整条链表)的所有数据 */
char *str = cJSON_Print(cjson_root);
strcpy(OutBuf, str);
printf("%s\n", str);
cJSON_Delete(cjson_root);
}
int JiexiInspect(char* message)
{
/* 解析整段JSO数据 */
cJSON *cjson_root = cJSON_Parse(message);
if (cjson_root == NULL)
{
printf("parse fail.\n");
return -1;
}
/* 依次根据名称提取JSON数据(键值对) */
cJSON *cjson_Dev = cJSON_GetObjectItem(cjson_root, "Dev");
cJSON* cjson_Side = cJSON_GetObjectItem(cjson_root, "Side");
printf("Dev: %s\n", cjson_Dev->valuestring);
printf("Side:%s\n", cjson_Side->valuestring);
/* 解析数组 */
cJSON * cjson_Type = cJSON_GetObjectItem(cjson_root, "Type");
if (cJSON_IsArray(cjson_Type))
{
int array_size = cJSON_GetArraySize(cjson_Type);
printf("array size:%d\n", array_size);
for (int i = 0;i< array_size;i++)
{
cJSON* SubObj = cJSON_GetArrayItem(cjson_Type, i);
if (NULL == SubObj)
{
continue;
}
printf("[%d]name:%s\number1:%d\number2:%d\n", i, \
cJSON_GetObjectItem(SubObj, "name")->valuestring, \
cJSON_GetObjectItem(SubObj, "number1")->valueint, \
cJSON_GetObjectItem(SubObj, "number2")->valueint);
}
}
cJSON_Delete(cjson_root);
return 0;
}
int main()
{
char outbuf[512] = { 0 };
Inspect(outbuf);
cout << endl;
JiexiInspect(outbuf);
system("pause");
return 0;
}
结果: