[Interest] iterate through JSON data
Hamish Moffatt
hamish at risingsoftware.com
Tue May 17 04:22:37 CEST 2016
On 17/05/16 12:02, Larry Martell wrote:
> On Mon, May 16, 2016 at 7:53 PM, Hamish Moffatt
> <hamish at risingsoftware.com> wrote:
>> On 17/05/16 08:24, Larry Martell wrote:
>>> I've see a lot of code that does something like this:
>>>
>>> QJsonDocument document = QJsonDocument::fromJson(jsonData);
>>> QJsonObject object = document.object();
>>> QJsonValue value = object.value("capData");
>>>
>>> But I don't want to hard code the keys - I want to pick up and store
>>> whatever happens to be in the JSON file. How can I iterate through it
>>> and do that?
>>>
>>> Also, what would be the best object to store this in so I can later
>>> access it as I want to?
>>>
>> QJsonObject has iterator methods, and for each value you can check if it is
>> itself an array or an object or a simple type (QJsonValue::isArray(),
>> isObject(), isString() etc).
>>
>> As for another object, I can't think of another with this flexibility. Why
>> not leave it in the QJson* objects?
> 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.
Hamish
More information about the Interest
mailing list