注意点
/*
* 存储字符串的指针的值为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是为了在判断数组是否为空,进行了取舍。
源代码下载链接