C语言实现JSON字符串解码与编码(二)头文件介绍

注意点

/*
* 存储字符串的指针的值为NULL则代表字符串为空
* 存储对象的指针的值为NULL则代表对象为空
* 数组的第一个元素的值为NULL则代表数组为空
*/

支持的数据类型

/* JSON的数据类型 */
typedef enum
{
	JSON_TYPE_BOOL = 0,//布尔类型的枚举 JSON_BOOL_t  false = -1, true = 1, null = 2
	JSON_TYPE_CHAR,
	JSON_TYPE_SHORT,
	JSON_TYPE_INT,
	JSON_TYPE_UCHAR,
	JSON_TYPE_USHORT,
	JSON_TYPE_UINT,
	JSON_TYPE_FLOAT,
	JSON_TYPE_DOUBLE,
	JSON_TYPE_STRING,
	JSON_TYPE_OBJECT,
	JSON_TYPE_ARRAY
}JSON_Type_t;

数据模型

/* JSON数据模型结构体 */
typedef struct JSON_MODEL
{
	JSON_Type_t type;//数据类型
	const char* keyName;//键名
	unsigned short offset;//偏移
	union
	{
		unsigned short objectSize;//对象大小 单位字节
		/* 子对象 */
		struct ChildObject
		{
			struct JSON_MODEL* model;//子对象的数据模型的地址
			unsigned int count;//子对象数据模型个数
		}child;
		/* 数组 */
		struct
		{
			JSON_Type_t type;//数组元素类型
			unsigned int count;//数组元素个数
			unsigned short size;//数组元素大小 单位字节
			struct ChildObject child;//如果数组元素是对象则需要填写这个
		}array;
	}value;
}JSON_MODEL_t, * PJSON_MODEL_t;

写入数据的宏

为了方便写入成员类型,定义相应的宏。

/* 写入数据模型宏 */
#define JSON_ROOT_OBJECT(s) \
{JSON_TYPE_OBJECT, 0, 0, .value.objectSize = sizeof(s)}

#define JSON_BOOL(s, keyName) \
{JSON_TYPE_BOOL, #keyName, offsetof(s, keyName)}

#define JSON_CHAR(s, keyName) \
{JSON_TYPE_CHAR, #keyName, offsetof(s, keyName)}

#define JSON_SHORT(s, keyName) \
{JSON_TYPE_SHORT, #keyName, offsetof(s, keyName)}

#define JSON_INT(s, keyName) \
{JSON_TYPE_INT, #keyName, offsetof(s, keyName)}

#define JSON_UCHAR(s, keyName) \
{JSON_TYPE_UCHAR, #keyName, offsetof(s, keyName)}

#define JSON_USHORT(s, keyName) \
{JSON_TYPE_USHORT, #keyName, offsetof(s, keyName)}

#define JSON_UINT(s, keyName) \
{JSON_TYPE_UINT, #keyName, offsetof(s, keyName)}

#define JSON_FLOAT(s, keyName) \
{JSON_TYPE_FLOAT, #keyName, offsetof(s, keyName)}

#define JSON_DOUBLE(s, keyName) \
{JSON_TYPE_DOUBLE, #keyName, offsetof(s, keyName)}

#define JSON_STRING(s, keyName) \
{JSON_TYPE_STRING, #keyName, offsetof(s, keyName)}

#define JSON_OBJECT(s, childKeyName, childModel, childModelCount) \
{JSON_TYPE_OBJECT, #childKeyName , offsetof(s, childKeyName), .value.child.model = childModel,  .value.child.count = childModelCount}

#define JSON_ARRAY(s, arrayKeyName, itemType, itemCount, itemSize) \
{JSON_TYPE_ARRAY, #arrayKeyName , offsetof(s, arrayKeyName), .value.array.type = itemType,  .value.array.count = itemCount,  .value.array.size = itemSize}

#define JSON_ARRAY_OBJECT(s, arrayKeyName, itemCount, itemSize, childModel, childModelCount) \
{JSON_TYPE_ARRAY, #arrayKeyName , offsetof(s, arrayKeyName), .value.array.type = JSON_TYPE_OBJECT,  .value.array.count = itemCount,  .value.array.size = itemSize, .value.array.child.model = childModel, .value.array.child.count = childModelCount}

比如学生对象

typedef struct stu
{
	char* id;//学号
	char* name;//姓名
	char* phone;//手机号
	char* addr;//住址
	char* grade;//年级
	Pscore_t score;//分数
}stu_t, * Pstu_t;

其对应的数据模型为

JSON_MODEL_t stuModel[] =
{
	JSON_ROOT_OBJECT(stu_t),
	JSON_STRING(stu_t, id),
	JSON_STRING(stu_t, name),
	JSON_STRING(stu_t, phone),
	JSON_STRING(stu_t, addr),
	JSON_STRING(stu_t, grade),
	JSON_OBJECT(stu_t, score, scoreModel, sizeof(scoreModel) / sizeof(JSON_MODEL_t))
};

成绩对象

typedef struct score
{
	float math;
	float chinese;
	float english;
	float science;
	float history;
}score_t, * Pscore_t;

其对应的数据模型为

JSON_MODEL_t scoreModel[] =
{
	JSON_ROOT_OBJECT(score_t),
	JSON_FLOAT(score_t, math),
	JSON_FLOAT(score_t, chinese),
	JSON_FLOAT(score_t, english),
	JSON_FLOAT(score_t, science),
	JSON_FLOAT(score_t, history)
};

布尔类型枚举

typedef enum
{
	JSON_BOOL_FALSE = -1,
	JSON_BOOL_TRUE = 1,
	JSON_BOOL_NULL = 2,
}JSON_BOOL_t;

false 不等于 0是为了在判断数组是否为空,进行了取舍。

C语言实现JSON字符串解码与编码(一)大致思路

C语言实现JSON字符串解码与编码(二)头文件介绍

C语言实现JSON字符串解码与编码(三)源代码

源代码下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值