Как в теме, я пытаюсь проанализировать эти 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
}
}
}
Я не эксперт по 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
, отметьте этот факт и укажите на нас туда, где это может быть найдено. Чем меньше работы требуется для репродуцирования проблемы, тем лучше.
На самом деле никакие данные не хранятся в Вашем 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 .