如何从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
班级没有成员函数来提示或类似的事情(那里有toDouble
,toString
等只要)。在这种情况下我该怎么办?通过QjsonValue
类提取整数值的最佳方法是什么?
答案 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