cJSON的使用

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)  //添加一个array到JSON串中
#define cJSON_AddItemToObject(object,name,s)cJSON_AddItemToObject(object, name,s)  //添加一个JSON串到JSON串中

以下测试程序会用到。

3.示例程序

#include 
#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;
	}*/


}

运行结果:
cJSON的使用_第1张图片

你可能感兴趣的:(C/C++,综合,json,c++,c语言)