JSON串肯定是最常用的,作为一个开发人员,如果不会用JSON,那有点说不过去了。C/C++我使用的cJSON库,这个比较小,而且就一个cJSON.h和一个cJSON.c,用起来非常方便。本人已经用了两年了,自打工作以来一直在使用。
下载地址:https://sourceforge.net/projects/cjson/
1.接口说明
cJSON API |
说明 |
cJSON_Version() |
获得cJSON的版本 |
cJSON_InitHooks(); |
初始化cJSON_Hooks结构体 |
cJSON_Parse(); |
将字符串解析成cJSON结构体 |
cJSON_ParseWithOpts() |
使用一些配置解析字符串 |
cJSON_Print() |
将cJSON结构体转换成格式化的字符串 |
cJSON_PrintUnformatted() |
将cJSON结构体转换成未格式化的字符串 |
cJSON_PrintBuffered() |
将cJSON结构体使用buffer的字符串,格式化可选 |
cJSON_PrintPreallocated() |
将cJSON结构体使用预分配的内存的字符串,格式化可选 |
cJSON_Delete() |
删除cJSON结构体 |
cJSON_GetArraySize() |
返回Array类型的大小,对Object类型也是有效的 |
cJSON_GetArrayItem() |
返回Array类型的index的值,对Object类型也有效 |
cJSON_GetObjectItem() |
使用key获得对应的value |
cJSON_GetObjectItemCaseSensitive() |
使用对大小写敏感的key获得对应的value |
cJSON_HasObjectItem() |
判断是否ObjectItem存在 |
cJSON_GetErrorPtr() |
获得错误信息 |
cJSON_IsInvalid() |
类型判断 |
cJSON_IsFalse() |
类型判断 |
cJSON_IsTrue() |
类型判断 |
cJSON_IsBool() |
类型判断 |
cJSON_IsNull() |
类型判断 |
cJSON_IsNumber() |
类型判断 |
cJSON_IsString() |
类型判断 |
cJSON_IsArray() |
类型判断 |
cJSON_IsObject() |
类型判断 |
cJSON_IsRaw() |
类型判断 |
cJSON_CreateNull() |
创造对应类型的cJSON |
cJSON_CreateTrue() |
创造对应类型的cJSON |
cJSON_CreateFalse() |
创造对应类型的cJSON |
cJSON_CreateBool() |
创造对应类型的cJSON |
cJSON_CreateNumber() |
创造对应类型的cJSON |
cJSON_CreateString() |
创造对应类型的cJSON |
cJSON_CreateRaw() |
创造对应类型的cJSON |
cJSON_CreateArray() |
创造对应类型的cJSON |
cJSON_CreateObject() |
创造对应类型的cJSON |
cJSON_CreateIntArray() |
批量创造对应类型的cJSON |
cJSON_CreateFloatArray() |
批量创造对应类型的cJSON |
cJSON_CreateDoubleArray() |
批量创造对应类型的cJSON |
cJSON_CreateStringArray() |
批量创造对应类型的cJSON |
cJSON_AddItemToArray() |
在指定Array后面增加Item |
cJSON_AddItemToObject() |
在指定Object后面增加Item |
cJSON_AddItemToObjectCS() |
在指定Object后面增加const Item |
cJSON_AddItemReferenceToArray() |
在指定Array后面增加Item引用 |
cJSON_DetachItemViaPointer() |
通过指针从Array删除Item的引用 |
cJSON_DetachItemFromArray() |
从Array删除Item的引用 |
cJSON_DeleteItemFromArray() |
从Array删除Item |
cJSON_DetachItemFromObject() |
从Object删除Item的引用 |
cJSON_DetachItemFromObjectCaseSensitive() |
大小写敏感的从Object删除Item的引用 |
cJSON_DeleteItemFromObject() |
从Object删除Item |
cJSON_DeleteItemFromObjectCaseSensitive() |
大小写敏感的从Object删除Item |
cJSON_InsertItemInArray() |
在Array指定位置插入Item |
cJSON_ReplaceItemViaPointer() |
使用指针替代Item |
cJSON_ReplaceItemInArray() |
替换Array的Item |
cJSON_ReplaceItemInObject() |
替换Object的Item |
cJSON_ReplaceItemInObjectCaseSensitive() |
大小写敏感的替换Object的Item |
cJSON_Duplicate() |
复制cJSON结构体 |
cJSON_Compare() |
比较两个cJSON结构体 |
cJSON_Minify() |
将格式化的字符串压缩 |
cJSON_AddNullToObject() |
调用cJSON_AddItemToObject和cJSON_CreateNull |
cJSON_AddTrueToObject() |
调用cJSON_AddItemToObject和cJSON_CreateTrue |
cJSON_AddFalseToObject() |
调用cJSON_AddItemToObject和cJSON_CreateFalse |
cJSON_AddBoolToObject() |
调用cJSON_AddItemToObject和cJSON_CreateBool |
cJSON_AddNumberToObject() |
调用cJSON_AddItemToObject和cJSON_CreateNumber |
cJSON_AddStringToObject() |
调用cJSON_AddItemToObject和cJSON_CreateString |
cJSON_AddRawToObject() |
调用cJSON_AddItemToObject和cJSON_CreateRaw |
cJSON_SetIntValue() |
设置int的值,同时也设置double的值 |
cJSON_SetNumberValue() |
后台会调用cJSON_SetNumberHelper |
cJSON_SetNumberHelper() |
设置cJSON的number类型的值 |
cJSON_malloc() |
cJSON的malloc函数,调用malloc函数 |
cJSON_free() |
cJSON的free函数,调用free函数 |
2.修改cJSON.h
在原有的头上新增了以下代码:
#define cJSON_AddArrayToObject(object,name,s)cJSON_AddItemToObject(object, name,s)
#define cJSON_AddItemToObject(object,name,s)cJSON_AddItemToObject(object, name,s)
以下测试程序会用到。
3.示例程序
#include
#include "cJSON.h"
int main()
{
std::cout << "Hello World!\n";
printf("创建JSON串->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
cJSON* dataJSON = cJSON_CreateObject();
cJSON* arrayJSON = cJSON_CreateArray();
cJSON_AddNumberToObject(arrayJSON,"id",100);
cJSON_AddStringToObject(arrayJSON,"name","沈雪冰");
cJSON_AddArrayToObject( dataJSON,"array", arrayJSON);
cJSON* itemJSON = cJSON_CreateObject();
cJSON_AddNumberToObject(itemJSON,"id",200);
cJSON_AddStringToObject(itemJSON,"loacl","H河北");
cJSON_AddItemToObject(dataJSON,"json",itemJSON);
cJSON_AddNumberToObject(dataJSON, "id", 1);
cJSON_AddBoolToObject(dataJSON,"Bool",true);
cJSON_AddFalseToObject(dataJSON,"false");
cJSON_AddNullToObject(dataJSON,"null");
cJSON_AddStringToObject(dataJSON, "optCode", "dev");
cJSON_AddStringToObject(dataJSON, "userName","测试JSON");
cJSON_AddStringToObject(dataJSON, "expire", "20291218");
cJSON_AddStringToObject(dataJSON, "taxId", "test20191218");
cJSON_AddStringToObject(dataJSON, "userId", "test20191218");
cJSON_AddStringToObject(dataJSON, "unitCode", "000000000000");
cJSON_AddStringToObject(dataJSON, "unitName", "总局");
cJSON_AddStringToObject(dataJSON, "slotId", "01");
cJSON_AddStringToObject(dataJSON, "devId", "147258369");
cJSON_AddStringToObject(dataJSON, "platId", "000000001");
cJSON_AddStringToObject(dataJSON, "platName", "我只是一个测试");
const char* jsonData = cJSON_Print(dataJSON);
printf("%s\n",jsonData);
printf("解析JSON串->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
cJSON* paramJSON = cJSON_Parse(jsonData);
cJSON* valueJSON = paramJSON->child;
while (valueJSON != NULL)
{
if (valueJSON->child != NULL)
{
cJSON* bufJSON = valueJSON->child;
int i = 0;
while (bufJSON != NULL)
{
if (bufJSON->type == cJSON_Number)
{
if (valueJSON->type != cJSON_Array)
{
printf("%s:%d\n", bufJSON->string ? bufJSON->string : valueJSON->string, bufJSON->valueint);
}
else
{
printf("%s[%d]:%d\n", bufJSON->string ? bufJSON->string : valueJSON->string,i, bufJSON->valueint);
}
}
else if (cJSON_String)
{
if (valueJSON->type != cJSON_Array)
{
printf("%s:%s\n", bufJSON->string ? bufJSON->string : valueJSON->string, bufJSON->valuestring); break;
}
else
{
printf("%s[%d]:%s\n", bufJSON->string ? bufJSON->string : valueJSON->string,i, bufJSON->valuestring); break;
}
}
bufJSON = bufJSON->next;
i++;
}
valueJSON = valueJSON->next;
continue;
}
switch (valueJSON->type)
{
case cJSON_False:
printf("%s:%d\n", valueJSON->string, valueJSON->valueint); break;
case cJSON_True:
printf("%s:%d\n", valueJSON->string, valueJSON->valueint); break;
case cJSON_Number:
printf("%s:%d\n", valueJSON->string, valueJSON->valueint); break;
case cJSON_String:
printf("%s:%s\n", valueJSON->string, valueJSON->valuestring); break;
case cJSON_NULL:
printf("%s:%d\n", valueJSON->string, valueJSON->valueint); break;
case cJSON_Array:
{
int arraySize = cJSON_GetArraySize(valueJSON);
for (int i = 0; i < arraySize; i++)
{
cJSON* buf = cJSON_GetArrayItem(valueJSON, i);
if (buf == NULL) continue;
if (buf->type == cJSON_Number)
{
printf("array[%d]:%d\n", i, buf->valueint);
}
else
{
printf("array[%d]:%s\n", i, buf->valuestring);
}
buf = buf->next;
}
}
case cJSON_Object:
case cJSON_Raw:
default:
break;
}
valueJSON = valueJSON->next;
}
if (paramJSON!=NULL)
{
cJSON_Delete(paramJSON); paramJSON = NULL;
}
if (dataJSON != NULL)
{
cJSON_Delete(dataJSON); dataJSON = NULL;
}
}
运行结果: