cJSON的使用

36 篇文章 0 订阅

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


}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值