由於工作需要,需要對Json數據進行解析。查閱了很多資料,發現相比於boost和jsoncpp,CJson更加小巧好用,不需要太多的準備工作,只需要把CJson.c和CJson.h導入工程,即可使用。
CJson源代碼和示例工程可在此處下載
CJson源碼和示例
1 使用CJson解析Json數據
如果要解析以下的Json數據:
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"id": 1
}, {
"firstName": "Jason",
"lastName": "Hunter",
"id": 2
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"id": 3
}]
}
首先把上述Json數據寫入char* jsonStr中,之後,調用
cJSON* root = cJSON_Parse(jsonStr);
得到Json數據指針root
root中存在一個節點,名稱爲programmers,內容爲一個數組,
調用:
cJSON* programmersNode = cJSON_GetObjectItem(root, "programmers");
得到該節點。由於此節點內容爲一個數組,可以使用:
int iSize = cJSON_GetArraySize(programmersNode);
取得此數組的元素個數
如果要取出某一個元素,可以使用:
cJSON* firstMan = cJSON_GetArrayItem(programmersNode, 0);
上述代碼取得了第一個人的數據,即
{
"firstName": "Brett",
"lastName": "McLaughlin",
"id": 1
}
要取出每一個元素,可以使用:
cJSON* firstName = cJSON_GetObjectItem(programmers[i], "firstName");
cJSON* lastName = cJSON_GetObjectItem(programmers[i], "lastName");
cJSON* id = cJSON_GetObjectItem(programmers[i], "id");
如果要輸出每一個元素的值:
cout << "id: " << id->valueint << endl;
cout << "FirstName: " << firstName->valuestring << endl;
cout << "lastName: " << lastName->valuestring << endl;
解析完畢後,要對空間進行釋放:(只需要刪除根節點即可)
cJSON_Delete(root);
至此,已經將Json數據基本解析完畢,其餘部分類似。解析部分代碼如下:
/* 解析Json函數 */
BOOL ParseJson(const char* jsonStr)
{
cJSON* root = cJSON_Parse(jsonStr);
BOOL ret = FALSE;
if (root != NULL)
{
cJSON* programmersNode = cJSON_GetObjectItem(root, "programmers");
if (programmersNode != NULL)
{
int iSize = cJSON_GetArraySize(programmersNode);
if (iSize == 3)
{
cJSON* programmers[3] = {0};
for (int i = 0; i < 3; ++i)
{
programmers[i] = cJSON_GetArrayItem(programmersNode, i);
if (programmers[i] != NULL)
{
cJSON* firstName = cJSON_GetObjectItem(programmers[i], "firstName");
cJSON* lastName = cJSON_GetObjectItem(programmers[i], "lastName");
cJSON* id = cJSON_GetObjectItem(programmers[i], "id");
if (firstName != NULL && lastName != NULL && id != NULL)
{
cout << "id: " << id->valueint << endl;
cout << "FirstName: " << firstName->valuestring << endl;
cout << "lastName: " << lastName->valuestring << endl;
}
else
{
cJSON_Delete(root);
return FALSE;
}
}
}
ret = TRUE;
}
}
}
cJSON_Delete(root);
return ret;
}
2 使用CJson生成Json數據
生成Json數據主要用到如下函數
cJSON_CreateObject //創建一個節點
cJSON_CreateArray //創建一個數組
cJSON_AddStringToObject //將一個字符串加入一個節點
cJSON_AddNumberToObject //將一個整數加入一個節點
cJSON_AddItemToArray //將另一個節點加入數組
如果要生成如下的Json串:
{
"programmers": [{
"firstname": "Brett",
"lastName": "McLaughlin",
"id": 1
}]
}
使用的代碼如下:
BOOL MakeJson()
{
cJSON *temp = cJSON_CreateObject();
if (temp == NULL)
{
//創建失敗
return FALSE;
}
//加入節點(鍵值對)
cJSON_AddStringToObject(temp, "firstname", "Brett");
cJSON_AddStringToObject(temp, "lastName", "McLaughlin");
cJSON_AddNumberToObject(temp, "id", 1);
cJSON * array = cJSON_CreateArray();
if (array == NULL)
{
//創建失敗
return FALSE;
}
cJSON_AddItemToArray(array, temp);
cJSON *root = cJSON_CreateObject();
if (root == NULL)
{
//創建失敗
return FALSE;
}
cJSON_AddItemToObject(root, "programmers", array);
char* strJson = cJSON_Print(root);
cout << strJson << endl;
free(strJson);
cJSON_Delete(root);
}
打印Json串的方法:
root是一個cJSON的節點,打印此節點下的所有內容:
char* strJson = cJSON_Print(root);
cout << strJson << endl;
free(strJson);