analisando dados QML JSON

3

Como no tópico, estou tentando analisar esses dados json no meu projeto QML

link: link

Portanto, tenho uma lista de 188 elementos, mas não sei como obter o valor de cada elemento ...

aqui é um link para o componente JSONListModel que usei neste exemplo

aqui está o código 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
        }

    }    

}
    
por Majster-pl 22.11.2014 / 01:35

2 respostas

6

Não sou especialista em JSONListModel, portanto, posso estar enganado, mas parece que espero iterar em uma lista de objetos. O que você recebe do rad.io é uma lista de strings, o que parece estar causando seus problemas. Mas como você não precisa fazer nenhum processamento sofisticado do resultado, é fácil fazer isso manualmente.

O que você quer fazer é analisar a resposta em uma lista (usando JSON.parse ). Então você pode percorrer os elementos da lista. Para cada um, crie um objeto e anexe-o a um ListModel . Observe que o ListModel aceita objetos , não seqüências de caracteres. Em seguida, o delegado pode referenciar as propriedades desses objetos.

Exemplo de código:

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
            }
        }
    }
}

Deixe-me levar um momento para lembrá-lo da importância de postar exemplos corretos, curtos e autônomos . O código que você postou não pôde ser executado devido a nenhum problema com a análise do JSON, mas porque um Tab não pode ser um widget de nível superior. Qualquer um que tentou ajudá-lo primeiro teve que descobrir isso antes de chegar ao problema real.

Além disso, ao usar um componente não padrão, como JSONListModel , anote esse fato e indique onde ele pode ser encontrado. Quanto menos trabalho for necessário para reproduzir o problema, melhor.

    
por Robert Schroll 22.11.2014 / 08:01
3

Na verdade, nenhum dado é armazenado em seu ListModel.

Suponho que você esteja usando este , do GitHub.

JSONListModel é preenchido usando o método append(jsobject dict) de QtQuick ListModel. Esse método requer um role e um value a ser especificado, mas os dados do json obtidos de rad.io contêm apenas os valores.

Por esse motivo, ListElements são adicionados ao seu modelo, mas não contêm dados. Você pode verificar isso adicionando as seguintes linhas ao seu delegado:

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

Eu sugiro que você leia o conteúdo do arquivo json que você baixou da web, usando XMLHttpRequest e, em seguida, analisá-lo e adicionar seu conteúdo a uma lista de seqüências de caracteres (ou um var). Você poderá acessar o conteúdo por meio de um ListView, usando a função modelData .

    
por Stefano Verzegnassi 22.11.2014 / 07:56

Tags