将JSON对象存储到C ++映射

时间:2013-10-23 09:49:36

标签: c++ json dictionary

我需要你们的帮助。

目前我正在使用cJSON来解析格式化为Json标准的数据。

以下数据是数据的一个示例。

{
    "time" : {              
        "timezone" : string,
        "ntpservers" : array<string>
    },
    "datetime" : {
        "value" : "2013-10-23 03:35:45.182042",
        "space-custom-class" : "datetime.datetime"
    }
}

我遇到的问题是我不知道如何将数据分解为键值对 并将它们存储在地图中。我可以看到“时间”是一个键,但值是一个字典,所以我如何将其存储为“时间”的值,这是“日期时间”键。我知道有一些迭代涉及,但我被卡住了。因为值可以是基本类型,数组或字典应该是一个像模板一样的通用对象? 一些例子会非常有用。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

JSON.org列出了许多可以使用的C ++ JSON解析器库。

答案 1 :(得分:0)

我会看看boost :: property_tree它会让你不必自己编写代码。

http://www.boost.org/doc/libs/1_54_0/doc/html/property_tree.html

答案 2 :(得分:0)

我不知道您可以在项目中使用哪些依赖项,因此我的答案可能不会被您接受。

在Qt5中存在一些可以编写JSON的类,如你所愿。这是一个用于演示的小例子:

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>

int main(int argc, char *argv[])
{
    QJsonObject topQuery;
    topQuery["objectType"] = QString("objects.Word");

    QJsonObject parameters;
    parameters["language"] = QString("en");
    parameters["to"] = QString("ru");
    parameters["rate"] = 0;
    parameters["isInput"] = true;

    topQuery["query"] = parameters;

    QJsonObject sortParameter;
    sortParameter["sortBy"] = QString("rate");
    sortParameter["direction"] = QString("desc");

    QJsonArray sortArray;
    sortArray.append(sortParameter);

    topQuery["sort"] = sortArray;
    topQuery["limit"] = 10;

    QJsonDocument document(topQuery);
    qDebug() << document.toJson();
}

此代码的结果将是:

{
    "limit": 10,
    "objectType": "objects.Word",
    "query": {
        "isInput": true,
        "language": "en",
        "rate": 0,
        "to": "ru"
    },
    "sort": [
        {
            "direction": "desc",
            "sortBy": "rate"
        }
    ]
}

对于Qt4,还存在具有simular api的库:http://qjson.sourceforge.net/

之前我也在寻找没有依赖关系来创建json的C ++ lib,比如stl :: map,但我发现只有一个Qt变体。

答案 3 :(得分:0)

是的,非常神秘。这是用cJson做的:

cJSON *current_element = NULL;
char *current_key = NULL;

cJSON_ArrayForEach(current_element, object)
{
    current_key = current_element->string;
    if (current_key != NULL)
    {
        /* do something with the key */
    }
}

参考:https://github.com/DaveGamble/cJSON/issues/167