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