4

我需要你们的帮助。

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

下面的数据是数据的一个例子。

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

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

提前感谢您的帮助。

4

4 回答 4

4

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

于 2013-10-23T10:52:01.347 回答
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/

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

于 2013-10-23T11:41:26.627 回答
0

我会看一下 boost::property_tree 它可以让您不必自己编写代码。

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

于 2013-10-23T10:09:54.727 回答
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

于 2018-01-09T13:41:13.147 回答