c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库
CSON
基于cJSON,運行于C語言平臺的json-struct模型解析工具
簡介
CSON是一個簡單的cJSON的二次封裝,相比于使用原生cJSON一層一層解析的方式,CSON采用模型映射的方式,使用模型將結構體的特征進行描述,然后根據模型,將json數據直接解析成結構體,免去使用原生cJSON需要多次調用API的復雜性,可以很大程度減少代碼冗余,增加代碼邏輯性。
CSON的模型映射借鑒了高級語言(比如說Java)的反射機制,通過建立數據模型,記錄結構體的元素,類型,偏移,然后直接在內存層面進行操作,對C語言提供類似于gson這樣的高效json解析工具
使用
CSON通過數據模型將結構體和json建立映射關系,因此,你需要做的就是在聲明結構體的時候同時,使用數據模型對結構體進行描述,之后,只需要直接調用CSON的api即可
聲明結構體
/** 項目結構體 */
struct project
{
int id;
char *name;
};
/** 倉庫結構體 */
struct hub
{
int id;
char *user;
struct project *cson;
};
定義數據模型
對每一個需要使用cson的結構體,都需要定義相對應的數據模型
/** 項目結構體數據模型 */
CsonModel projectModel[] =
{
CSON_MODEL_OBJ(struct project),
CSON_MODEL_INT(struct project, id),
CSON_MODEL_STRING(struct project, name),
};
/** 倉庫結構體數據模型 */
CsonModel hubModel[] =
{
CSON_MODEL_OBJ(struct hub),
CSON_MODEL_INT(struct hub, id),
CSON_MODEL_STRING(struct hub, user),
CSON_MODEL_STRUCT(struct hub, cson, projectModel, sizeof(projectModel)/sizeof(CsonModel))
};
使用CSON解析
只需要定義好數據模型,就可以使用CSON讀json進行序列化和反序列化
void csonDemo(void)
{
char *jsonDemo = "{\"id\": 1, \"user\": \"Letter\", \"cson\": {\"id\": 2, \"name\": \"cson\"}}";
/** 解析json */
struct hub *pHub = csonDecode(jsonDemo, hubModel, sizeof(hubModel)/sizeof(CsonModel));
printf("hub: id: %d, user: %s, project id: %d, project name: %s\r\n",
pHub->id, pHub->user, pHub->cson->id, pHub->cson->name);
/** 序列化對象 */
char *formatJson = csonEncodeFormatted(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));
printf("format json: %s\r\n", formatJson);
/** 釋放結構體對象 */
csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));
/** 釋放序列化生成的json字符串 */
csonFreeJson(formatJson);
}
運行結果:
hub: id: 1, user: Letter, project id: 2, project name: cson
format json: {
"id": 1,
"user": "Letter",
"cson": {
"id": 2,
"name": "cson"
}
}
可以看到,無論是解析json,還是序列化結構體到json,在使用CSON的情況下,都只需要一行代碼就可以解決,同樣的操作,在使用原生cJSON的情況下,你可能需要多次判斷,解析元素
結構體數據類型
CSON采用數據模型對結構體進行解析,在方便json操作的同時,也給結構體的定義帶來了一些限制,目前,CSON所支持在結構體中定義的數據類型包括:
整數(char, short, int, long)
浮點數(float, double)
字符串(char *)
基本類型數組(char[], short[], int[], long[], float[], double[], *char[])
子結構體(指針形式)
鏈表(CsonList)
其中,為了方便解析,CSON定義了一個專用的鏈表(CsonList),用于對json中復雜結構的數組映射
CSON支持的數據類型基本包括絕大多數使用場景,對于一些之前就定義好的結構體,可能需要稍微做一點修改
數據模型映射
CSON采用數據模型建立結構體同json之間的映射,數據模型通過結構體數組進行定義,數據模型定義如下:
/**
* @brief CSON數據模型定義
*
*/
typedef struct cson_model
{
CsonType type; /**< 數據類型 */
char *key; /**< 元素鍵值 */
short offset; /**< 元素偏移 */
union
{
struct
{
struct cson_model *model; /**< 子結構體模型 */
short size; /**< 子結構體模型大小 */
} sub; /**< 子結構體 */
struct
{
CsonType eleType; /**< 數組元素類型 */
short size; /**< 數組大小 */
} array; /**< 數組 */
int objSize; /**< 對象大小 */
CsonType basicListType; /**< 基礎數據鏈表類型 */
} param;
} CsonModel;
對于每一個需要使用CSON的結構體,都需要定義一個數據模型,每一個數據模型都需要包含一條結構體描述CSON_MODEL_OBJ(type)以及若干個數據描述,取決于結構體的成員數量
一般情況下,你只需要使用CSON提供的宏進行數據模型條目的定義,數據模型宏與對應的數據類型對應如下:
數據模型宏
數據類型
備注
CSON_MODEL_OBJ(type)
結構體
用于描述整個結構體,每一個數據模型都需要包含此條目
CSON_MODEL_CHAR(type, key)
char
CSON_MODEL_SHORT(type, key)
short
CSON_MODEL_INT(type, key)
int
CSON_MODEL_LONG(type, key)
long
CSON_MODEL_FLOAT(type, key)
float
CSON_MODEL_DOUBLE(type, key)
double
CSON_MODEL_BOOL(type, key)
bool
C沒有bool,對應為char
CSON_MODEL_STRING(type, key)
char *
CSON_MODEL_STRUCT(type, key, submodel, subsize)
子結構體
子結構體必須是結構體指針的形式
CSON_MODEL_LIST(type, key, submodel, subsize)
CsonList
CSON定義的鏈表
CSON_MODEL_ARRAY(type, key, elementType, arraySize
數組
支持基本數據類型, 數組的每一個元素必須合法
API
CSON源文件有完整的注釋,可以通過Doxygen等工具導出完整的API文檔,以下是幾個關鍵API的說明
初始化
初始化CSON,提供內存分配和內存釋放函數,對于標準C庫可以使用malloc和free
void csonInit(void *malloc, void *free)
參數
malloc 內存分配函數
free 內存釋放函數
反序列化
解析json,將json字符串反序列化成結構體對象
void *csonDecode(const char *jsonStr, CsonModel *model, int modelSize)
參數
jsonStr json字符串
model 描述目標結構體的數據模型
modelSize 數據模型大小
返回
void * 反序列化得到的結構體對象
序列化
編碼結構體,將結構體對象序列化成json字符串
char* csonEncode(void *obj, CsonModel *model, int modelSize, int bufferSize, int fmt)
參數
obj 源結構體對象
model 描述源結構體的數據模型
modelSize 數據模型大小
bufferSize 可分配給json字符串的空間大小,需要根據內容估計大小
fmt 是否格式化json字符串
返回
char * 序列化得到的json字符串
空間釋放
CSON提供了兩個釋放內存的函數,用于釋放CSON生成的結構體對象和json字符串
釋放結構體對象
void csonFree(void *obj, CsonModel *model, int modelSize)
參數
obj 待釋放的結構體對象
model 待釋放的結構體數據模型
modelSize 待釋放的結構體數據模型大小
釋放json字符串
void csonFreeJson(const char *jsonStr)
參數
jsonStr 待釋放的json字符串
注意
數據模型根據結構體不同而不同,數據模型的數量=結構體成員數量+1,多出來的一條是定義結構體CSON_MODEL_OBJ(type)
數組類型映射時會處理給進去的數組大小,所以請確保每一個數組元素都是合法的
基本數據類型鏈表采用類似子結構體的方式,CSON默認定義了基本數據類型鏈表元素的數據模型,通過類似CSON_MODEL_LIST(struct test, strList, CSON_MODEL_STRING_LIST, CSON_BASIC_LIST_MODEL_SIZE)進行定義即可
總結
以上是生活随笔為你收集整理的c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据变化通通知机制_深入理解N
- 下一篇: ios uiview 如何刷新_ios-