如何从Qt中的JSON数据中检索整数值

时间:2014-03-18 09:07:35

标签: c++ json qt

如何从QJsonValue对象中检索整数值?假设我有以下JSON数据:

    {
        "res": 1,
        "message": "Common error"
    }

我需要提取" res"这些数据的价值,所以我尝试使用以下代码:

QJsonDocument d = QJsonDocument::fromJson(some_json_data.toUtf8());
QJsonObject root_object = d.object();
QJsonValue res = root_object.value("res");

但是我发现QJsonValue班级没有成员函数来提示或类似的事情(那里有toDoubletoString等只要)。在这种情况下我该怎么办?通过QjsonValue类提取整数值的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

(tl; dr:答案结束时的单行解决方案。)

首先是一种全面的控制方式。下面的代码假定int对于整数而言是足够的范围,但可以扩展为int64_t的大部分范围(但更好地测试边界情况以使其完全正确):

QJsonValue res = root_object.value("res");

int result = 0;
double tmp = res.toDouble();
if (tmp >= std::numeric_limits<int>::min() && // value is not too small
    tmp <= std::numeric_limits<int>::max() && // value is not too big
    std::floor(tmp) == tmp // value does not have decimals, if it's not ok
   ) {
    result = std::floor(tmp); // let's be specific about rounding, if decimals are ok
} else {
    // error handling if you are not fine with 0 as default  value
}

使用QVariant的一种较短的方式,例如,如果您只是想让Qt做它的事情,也可以将结果转换为更大的整数类型。我不确定它如何处理整数值,这些值对于双精度来说太大而无法准确处理,所以如果这很重要,那么再次测试。

QJsonValue res = root_object.value("res");

QVariant tmp = res.toVariant();

bool ok = false;
qlonglong result = tmp.toLongLong(&ok);

if (!ok) {
    // error handling if you are not fine with 0 as default value
}

或与错误忽略单行相同,根据需要更改整数类型:

qlonglong result = root_object.value("res").toVariant().toLongLong();

答案 1 :(得分:1)

int QJsonValue::toInt(int defaultValue = 0) const

  

将值转换为int并返回它。

     

如果type()不是Double或者值不是整数,则   将返回defaultValue。

QByteArray JSettings::read_file(QString path)
{
    QFile file;
    file.setFileName(path);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return QByteArray();

    QByteArray barray = file.readAll();
    file.close();
    return barray;
}

QVariantMap JSettings::to_map(QByteArray json)
{
    QJsonDocument jdoc = QJsonDocument::fromJson(json);
    QVariantMap vmap = jdoc.toVariant().toMap();
    // qDebug() << vmap["res"].toInt();
    return vmap;
}

QJsonObject JSettings::to_object(QByteArray json)
{
    QJsonDocument jdoc = QJsonDocument::fromJson(json);
    QJsonObject obj = jdoc.object();
    // qDebug() << obj["res"].toInt();
    return obj;
}

Qt JSON门户网站:http://doc.qt.io/qt-5/json.html

答案 2 :(得分:0)

QJsonDocument d = QJsonDocument::fromJson(some_json_data.toUtf8());
QJsonObject root_object = d.object();
QJsonValue res = root_object.value("res");
int i = res.toString().toInt();

这是有效的,QString到Int