【问题标题】:Qjson get object name [closed]Qjson获取对象名称[关闭]
【发布时间】:2013-12-22 15:40:07
【问题描述】:

我有一个 json 对象,如何获取对象名称? 我不能有对象名称,它将由服务器发送,这样我应该得到对象名称。

{
    "success":1,
    "return":{
        "343152":{//get this object name
            "pair":"usd_eur",
            "type":"sell",
            "amount":1.00000000,
            "rate":3.00000000,
            "timestamp_created":1342448420,
            "status":0
        }
                "343157":{//get this object name
            "pair":"usd_eur",
            "type":"sell",
            "amount":1.00000000,
            "rate":3.00000000,
            "timestamp_created":1342448420,
            "status":0
        }
    }

}

【问题讨论】:

  • 您是在尝试使用 QtCore 5.X 中的 json 支持还是第三方 qjson 库?另外,你用的是哪个qt?
  • 我给了+1,因为我认为QtCore中的json支持相对较新,获得更多示例总是好的,但真的:),如果你不是,我不建议使用qjson计划以 Qt 4 为目标,即使您这样做了,如果尚未完成,我建议您反向移植此 json 功能。原因是它是由第三方实体而不是 Qt 项目维护的,所以它可能会得到更少的提交和工作,而且,根据 Thiago 的基准,它会慢很多。就个人而言,我也不喜欢它是显式解析器 API。 :)

标签: c++ qt qt5 qtcore qjson


【解决方案1】:

您应该在版本 >= 5.X 的 QtCore 中使用 json 支持。您可以使用以下代码做到这一点:

json.txt

{
    "success": 1,
    "return": {
        "343152": {
            "pair": "usd_eur",
            "type": "sell",
            "amount": 1.00000000,
            "rate": 3.00000000,
            "timestamp_created": 1342448420,
            "status": 0
        },

        "343157": {
            "pair": "usd_eur",
            "type": "sell",
            "amount ":1.00000000,
            "rate": 3.00000000,
            "timestamp_created": 1342448420,
            "status": 0
        }
    }
}

main.cpp

#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>

#include <QByteArray>
#include <QStringList>
#include <QDebug>
#include <QFile>

int main()
{
    QFile file("json.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "File open error:" << file.errorString();
        return 1;
    }

    QByteArray jsonByteArray = file.readAll();

    file.close();

    QJsonParseError jsonParseError;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonByteArray, &jsonParseError);
    if (jsonParseError.error != QJsonParseError::NoError) {
        qDebug() << "Error happened:" << jsonParseError.errorString();
        return 1;
    }

    if (!jsonDocument.isObject()) {
        qDebug() << "The json data is not an object";
        return 1;
    }

    QJsonObject mainJsonObject(jsonDocument.object());

    QJsonValue returnJsonValue = mainJsonObject.value(QStringLiteral("return"));

    if (!returnJsonValue.isObject()) {
        qDebug() << "The json data is not an object";
        return 1;
    }

    qDebug() << "KEYS WANTED:" << returnJsonValue.toObject().keys();

    return 0;
}

输出

g++ -Wall -fPIC -I/usr/include/qt -I/usr/include/qt/QtCore -I/usr/include -lQt5Core main.cpp && ./a.out

KEYS WANTED: ("343152", "343157")

【讨论】:

  • 谢谢,这也像 qvariantmap 迭代器一样工作。
  • @BMacit:不用担心,欢迎。
【解决方案2】:

由于您的帖子被标记为 qjson,我假设您正在使用它...

QJson::Parser parser;
bool ok;
QVariantMap result = parser.parse (json, &ok).toMap(); // json is a QByteArray w. the data
QVariantMap returnMap = result["return"].toMap();

// iterate your map to get the names you're interested in.
for(QVariantMap::const_iterator iter = returnMap.begin(); iter != returnMap.end(); ++iter) {
    qDebug() << iter.key();
}

// Do whatever you need with yourObj..

http://qjson.sourceforge.net/usage/

【讨论】:

  • ,我没有 "343152" 我需要在 json 中得到 "343152" 我怎样才能得到 "343152"?
  • 更新了我的答案。你需要迭代returnMap
  • 这不行恕我直言,因为OP使用的是Qt 5... QJson慢很多倍,最好使用Qt的当前首席维护者Lars编写的官方支持的功能项目。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多