JSON构造/解析(by C)---cJSON和json-c
#include
void printJson(cJSON *root){ if(!root) { printf("NULL JSON root.\n"); return; } printf("Type=0x%02x, %s=%s\n", root->type, root->string, cJSON_Print(root)); cJSON_Print会根据类型打印}
static char * makeJson(void){ cJSON *pJsonRoot = NULL; cJSON *pSubJson = NULL; char *p = NULL;
pJsonRoot = cJSON_CreateObject(); if(NULL == pJsonRoot) { printf("%s line=%d NULL\n", __func__, __LINE__); return NULL; } cJSON_AddStringToObject(pJsonRoot, "hello", "hello world"); String类型 cJSON_AddNumberToObject(pJsonRoot, "number", 10010); Number类型 cJSON_AddBoolToObject(pJsonRoot, "bool", 1); bool类型 pSubJson = cJSON_CreateObject(); 创建一个cJSON,用于嵌套数据 if(NULL == pSubJson) { printf("%s line=%d NULL\n", __func__, __LINE__); cJSON_Delete(pJsonRoot); return NULL; } cJSON_AddStringToObject(pSubJson, "subjsonobj", "a sub json string"); 在子cJSON下,增加一个String类型数据 cJSON_AddItemToObject(pJsonRoot, "subobj", pSubJson); 将子cJSON加入到pJsonRoot
p = cJSON_Print(pJsonRoot); if(NULL == p) { printf("%s line=%d NULL\n", __func__, __LINE__); cJSON_Delete(pJsonRoot); return NULL; }
cJSON_Delete(pJsonRoot);
return p;}
static void parseJson(char * pMsg){ cJSON *pJson; cJSON *pSub; cJSON * pSubSub;
if(NULL == pMsg) { return; }
pJson = cJSON_Parse(pMsg); if(NULL == pJson) { return ; }
pSub = cJSON_GetObjectItem(pJson, "hello"); printJson(pSub);
pSub = cJSON_GetObjectItem(pJson, "number"); printJson(pSub);
pSub = cJSON_GetObjectItem(pJson, "bool"); printJson(pSub);
pSub = cJSON_GetObjectItem(pJson, "subobj"); printJson(pSub);
pSubSub = cJSON_GetObjectItem(pSub, "subjsonobj"); printJson(pSubSub);
cJSON_Delete(pJson);}
int main(void){ char *p;
/* print the version */ printf("Version: %s\n", cJSON_Version()); 获取cJSON版本号
p = makeJson(); 构造JSON数据 if(NULL == p) { return 0; } printf("p = \n%s\n\n", p); 打印构造的字符串 parseJson(p); 解析JSON数据,并打印Type-Key-Value free(p); return 0;}