парсинг данных JSON QML

Как в теме, я пытаюсь проанализировать эти json данные в к моему проекту QML

ссылка: http://www.rad.io/info/menu/valuesofcategory?category=_genre

Таким образом, я имею список 188 элементов, но не знаю, как получить значение каждого элемента...

вот ссылка на компонент JSONListModel, который я использовал в этом примере

вот код qml:

import QtQuick 2.0
import Ubuntu.Components 1.1
import "../components"
import Ubuntu.Components.ListItems 1.0 as ListItem


Page {
    title: i18n.tr("by Genre")


    JSONListModel {
        id: json
        source: "http://www.rad.io/info/menu/valuesofcategory?category=_genre"
        query: "$"
    }


    UbuntuListView {
        height: parent.height
        width: parent.width
        clip: true
        model: json.model
        cacheBuffer: contentHeight


        delegate: ListItem.Standard {
            text: index + "  " + indexValue
        }

    }    

}
3
задан 22 November 2014 в 15:03

2 ответа

Я не эксперт по JSONListModel, таким образом, я могу ошибиться, но это, кажется, ожидает выполнять итерации по списку Объектов. То, что Вы получаете от rad.io, является списком строк, который, кажется, вызывает Ваши проблемы. Но так как Вы не должны делать никакой необычной обработки результата, легко прокрутить это вручную.

то, Что Вы хотите сделать, проанализировать ответ в список (использующий JSON.parse). Тогда можно пройти элементы списка. Для каждого Вы создаете объект и добавляете это к ListModel. Обратите внимание, что эти ListModel берет объекты , не строки. Тогда делегат может сослаться на свойства тех объектов.

Пример кода:

import QtQuick 2.0
import Ubuntu.Components 1.1
import Ubuntu.Components.ListItems 1.0 as ListItem

MainView {
    width: 300
    height: 600
    property string source: "http://www.rad.io/info/menu/valuesofcategory?category=_genre"

    ListModel {
        id: listModel
    }

    Component.onCompleted: {
        var xhr = new XMLHttpRequest;
        xhr.open("GET", source);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == XMLHttpRequest.DONE) {
                var list = JSON.parse(xhr.responseText);
                listModel.clear();
                for (var i in list)
                    listModel.append({ "genre": list[i] });
            }
        }
        xhr.send();
    }

    Page {
        title: i18n.tr("by Genre")

        UbuntuListView {
            height: parent.height
            width: parent.width
            clip: true
            model: listModel
            cacheBuffer: contentHeight

            delegate: ListItem.Standard {
                text: index + "  " + genre
            }
        }
    }
}

Позволяют мне занять одну минуту для напоминания Вам о важности регистрации короткие, автономные, корректные примеры . Код, который Вы отправили отказавший для выполнения не из-за любой проблемы с парсингом JSON, но потому что Tab не может быть виджет верхнего уровня. Любой, кто пытался помочь Вам сначала, должен был выяснить что прежде, чем добраться до настоящей проблемы.

кроме того, при использовании компонента не по умолчанию, как JSONListModel, отметьте этот факт и укажите на нас туда, где это может быть найдено. Чем меньше работы требуется для репродуцирования проблемы, тем лучше.

5
ответ дан 17 November 2019 в 09:23

На самом деле никакие данные не хранятся в Вашем ListModel.

я предполагаю, что Вы используете это от GitHub.

JSONListModel заполнен при помощи метода append(jsobject dict) от QtQuick ListModel. Этот метод требует роль и значение быть определенным, но json данные, которые Вы получаете от rad.io, содержат только значения.

По этой причине, ListElements добавляются в Вашей модели, но они не содержат данных. Можно проверить это путем добавления следующих строк в делегате:

Component.onCompleted: {
    console.log(JSON.stringify(json.model.get(model.index)))
}

я предложил бы, чтобы Вы считали содержание json файла, который Вы загружаете с сети, с помощью XMLHttpRequest, и затем анализируете его и добавляете его содержание к списку строк (или var). Вы будете в состоянии получить доступ к содержанию через ListView, с помощью роль modelData .

3
ответ дан 17 November 2019 в 09:23

Другие вопросы по тегам:

Похожие вопросы: