Json數據解析和生成(C/C++, 使用CJson)

由於工作需要,需要對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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章