[Interest] iterate through JSON data

Larry Martell larry.martell at gmail.com
Tue May 17 20:12:04 CEST 2016


On Mon, May 16, 2016 at 11:18 PM, Alexey Rusakov <ktirf at users.sf.net> wrote:
> On 17 May 2016 at 12:01, Larry Martell <larry.martell at gmail.com> wrote:
>
>> >> My JSON file looks like this:
>> >>
>> >>
>> >> {
>> >>     "capData": {
>> >>        "host": "foo.bar.com",
>> >>        "initial_port": "8000"
>> >>        "secondary_port": "8001"
>> >>     },
>> >>     "django": {
>> >>        "host": "baz.bar.com",
>> >>        "port": "8004"
>> >>     }
>> >> }
>> >>
>> >>
>> >> My code looks like this:
>> >>
>> >>
>> >>    QFile file(QCoreApplication::applicationDirPath() + "/" + CONFIG_PATH);
>> >>    QByteArray val;
>> >>    QJsonDocument config_json;
>> >>    QJsonObject config;
>> >>
>> >>    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
>> >>      val = file.readAll();
>> >>      file.close();
>> >>      config_json = QJsonDocument::fromJson(val);
>> >>      config = config_json.object();
>> >>      QJsonValue value = config.value("capData");
>> >>      QJsonArray array = value.toArray();
>> >>      foreach (const QJsonValue & v, array)
>> >>          qWarning() << v.toObject().value("host").toString();
>> >>    }
>> >>
>> >> I never enter my foreach loop, so I wrote out each variable with
>> >> qWarning().
>> >>
>> >> When I print out val it has:
>> >>
>> >> "{\n   \"capData\": {\n      \"host\": \"foo.bar.com\",\n
>> >> \"initial_port\": \"8000\"\n      \"secondary_port\": \"8001\"\n
>> >> },\n   \"django\": {\n      \"host\": \"baz.bar.com\",\n
>> >> \"port\": \"8004\"\n   }\n}\n"
>> >>
>> >> But when I print out config_json I get:
>> >>
>> >> QJsonDocument()
>> >
>> >
>> > Your JSON is invalid - you're missing a comma on the end of the initial_port
>> > line. config_json.isEmpty() is true as a result, and isObject() is false.
>>
>> Argh! Thank you so much for noticing that. Also, someone emailed me
>> off list and pointed out that I should not use toArray() but
>> toObject(). So now I have:
>>
>>     QJsonObject obj = config.value("capData").toObject();
>>     foreach (const QJsonValue & v, obj)
>>         qWarning() << v.toObject().value("host").toString();
>>
>> When I print out obj I have:
>>
>> QJsonObject({"host":"foo.bar.com","initial_port":"8000","secondary_port":"8001"})
>>
>> But in the foreach loop v.toObject().value("host").toString() is an
>> empty string.
> That was me - sorry for an off-list message. Now you're over-casting
> your value to an Object whereas you shouldn't. This part brings you
> nowhere:
>> v.toObject().value("host")
> while your values are actually here:
>> qWarning() << v.toString();
>
> And just for your interest, you might even want to do
>> qWarning() << v;
>
> This won't give you key names, though. I use a STL-style iterators to
> get the whole pack:
>> for (auto iter = obj.begin(); iter != obj.end(); ++iter)
>>     qWarning() << iter.key() << "->" << iter.value();

Huge thanks to Alexey and Hamish for all your help. I have this
working as I want now.



More information about the Interest mailing list