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函数 |
JSON串肯定是最常用的,作为一个开发人员,如果不会用JSON,那有点说不过去了。C/C++我使用的cJSON库,这个比较小,而且就一个cJSON.h和一个cJSON.c,用起来非常方便。本人已经用了两年了,自打工作以来一直在使用。
下载地址:https://sourceforge.net/projects/cjson/
- 接口说明
- 修改头文件
- 示例代码
1.接口说明
2.修改cJSON.h
在原有的头上新增了以下代码:
#define cJSON_AddArrayToObject(object,name,s)cJSON_AddItemToObject(object, name,s) //添加一个array到JSON串中
#define cJSON_AddItemToObject(object,name,s)cJSON_AddItemToObject(object, name,s) //添加一个JSON串到JSON串中
以下测试程序会用到。
3.示例程序
#include <iostream>
#include "cJSON.h"
int main()
{
std::cout << "Hello World!\n";
//创建JSON
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_AddRawToObject(dataJSON,"raw","aaaaaaa");
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)
{
//child
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;
}
}
//printf("%s:%d", valueJSON->string, valueJSON->valueint); break;
case cJSON_Object:
//printf("%s:%d", valueJSON->string, valueJSON->valueint); break;
case cJSON_Raw:
//printf("%s:%d", valueJSON->string, valueJSON->valueint); break;
default:
break;
}
valueJSON = valueJSON->next;
}
if (paramJSON!=NULL)
{
cJSON_Delete(paramJSON); paramJSON = NULL;
}
if (dataJSON != NULL)
{
cJSON_Delete(dataJSON); dataJSON = NULL;
}
/*if (arrayJSON != NULL)
{
cJSON_Delete(arrayJSON); arrayJSON = NULL;
}
if (itemJSON != NULL)
{
cJSON_Delete(itemJSON); itemJSON = NULL;
}*/
}
运行结果: