Qt анализирует массив объектов JSON - PullRequest
0 голосов
/ 17 марта 2019

У меня есть следующий запрос JSON (только его фрагмент), и я пытаюсь проанализировать температуруHigh в данных [{}].Я не могу понять, как разобрать массив объектов внутри объекта.Я использую Qt.

{    
    "latitude":xxx,
    “longitude":xxx,
    “timezone":"America/New_York",
    “currently":{
    "time":1552765335,
    “summary":"Clear",
    “icon":"clear-day",
    “nearestStormDistance":4,
    “nearestStormBearing":268,
    “precipIntensity":0,
    “precipProbability":0,
    “temperature":48.32,
    “apparentTemperature":43.25,
    “dewPoint":20.91,
    “humidity":0.33,
    “pressure":1014.29,
    “windSpeed":12.22,
    “windGust":20.11,
    “windBearing":310,
    “cloudCover":0.04,
    “uvIndex":3,
    “visibility":9.64,
    “ozone":317.85
    },
    “daily":{
        "summary":"No precipitation throughout the week, with high temperatures falling to 43°F on Tuesday.",
        “icon":"clear-day",
        “data":[{
            "time":1552708800,
            “summary":"Partly cloudy until afternoon.",
            “icon":"partly-cloudy-day",
            “sunriseTime":1552734266,
            “sunsetTime":1552777293,
            “moonPhase":0.34,
            “precipIntensity":0.0007,
            “precipIntensityMax":0.0101,
            “precipIntensityMaxTime":1552708800,
            “precipProbability":0.35,
            “precipType":"rain",
            “temperatureHigh":48.89,
            “temperatureHighTime":1552759200,
            “temperatureLow":31.84,
            “temperatureLowTime":1552820400,
            “apparentTemperatureHigh":43.85,
            “apparentTemperatureHighTime":1552762800,
            “apparentTemperatureLow":22.64,
            “apparentTemperatureLowTime":1552820400,
            “dewPoint":29.06,
            “humidity":0.52,

Пока это то, что у меня есть

QJsonParseError jError;
QJsonDocument test = QJsonDocument::fromJson(data, &jError);

QVariantMap qVar1 = jObj.value("daily").toVariant().toMap();

1 Ответ

1 голос
/ 17 марта 2019

Это минимальный пример JSON, с которым я работал:

{
    "humidity": 0.33,
    "pressure": 1014.29,
    "daily": {
        "data": [
            {
                "temperatureHigh": 48.89,
                "temperatureLow": 31.84
            }
        ]
    }
}

Предполагая, что вы уже прочитали или сохранили свой JSON в QByteArray экземпляре с именем json:

QJsonParseError err;
auto doc = QJsonDocument::fromJson(json, &err);           // parse the json
if (err.error != QJsonParseError::NoError)
    qDebug() << err.errorString();

QJsonObject obj = doc.object();                                  // get the object
qDebug() << "obj:" << obj;

QJsonObject daily = obj.value("daily").toObject();               // get the daily value as an object     
qDebug() << "daily:" << daily;

QJsonArray data = daily.value("data").toArray();                // get the data value as an array    
qDebug() << "data:" << data;

QJsonObject first = data[0].toObject();                          // get the first value as an object    
qDebug() << "first:" << first;

double temperatureHigh = first.value("temperatureHigh").toDouble(); // get the temperatureHigh value    
qDebug() << "temperatureHigh:" << temperatureHigh;

Вывод:

obj: QJsonObject({"daily":{"data":[{"temperatureHigh":48.89,"temperatureLow":31.84}]},"humidity":0.33,"pressure":1014.29})
daily: QJsonObject({"data":[{"temperatureHigh":48.89,"temperatureLow":31.84}]})
data: QJsonArray([{"temperatureHigh":48.89,"temperatureLow":31.84}])
first: QJsonObject({"temperatureHigh":48.89,"temperatureLow":31.84})
temperatureHigh: 48.89

В одной строке:

auto temperatureHigh = doc.object().value("daily").toObject().value("data").toArray()[0].toObject().value("temperatureHigh");

Некоторые варианты, которые вы можете выбрать (используя преимущества QJsonValue::operator[] перегрузки ):

auto temperatureHigh = doc.object().value("daily")["data"][0].toObject()["temperatureHigh"];

----

const auto obj = doc.object();    // obj must be const to call the appropriate overload that returns QJsonValue   
auto temperatureHigh = obj["daily"]["data"][0]["temperatureHigh"];

Действительно, единственными классами и типами, которые вы должны учитывать при обходе JSON, являются QJsonObject, QJsonArray и QJsonValue.(Нет необходимости использовать QVariant или QVariantMap.) Прочитайте документы, напишите больше кода, и вы привыкнете к этому.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...