Qt - JSON - prośba o wyjaśnienie do czego służą klasy

0

Chciałbym móc w Qt zapisywać ustawienia programu - czy to pozycję okna lub jakieś ustawienia zaznaczone/wpisane przez usera. Do tego celu ktoś z was polecał mi JSON-a.

No więc przeglądam sobie tą dokumentację i w związku z tym mam klika pytań aby ktoś mnie naprowadził czy moje myślenie jest słuszne - chodzi mi o "te składanie klocków" jak programista które mi ktoś zarzucił w wątku -> C# i Qt

  1. Czy klasa QJsonArray służy do przechowywania ustawień w pamięci komputera ? (jeden z moich pomysłów)

Załóżmy, że user coś zmienia w ustawieniach - to wypadałoby gdzieś trzymać ustawienia w pamięci dopóki nie zrzuci się tych ustawień do pliku i na odwrót, program powinien wczytać zawartość pliku do tej tablicy i user może dokonywać zmian na zawartości tej tablicy - poprzez program oczywiście

  1. klasa QJsonDocument - no już sam opis wskazuje, że klasa ta obsługuje format JSON-a

Czyli mogę wczytać format pliku JSON za pomocą tej klasy, załadować zawartość do tablicy za pomocą klasy QJsonArray i dokonać zmian, potem zapisać do pliku

  1. klasa QJsonObject - wiem, że to jest klasa typu Mapa - i teraz pytanie do czego mogę to wykorzystać ? Do wyszukiwania opcji/ustawień ?

  2. klasa QJsonValue - to nie wiem do czego można wykorzystać ? Czy ktoś podpowie jakiś obrazek ?

  3. klasa QJsonParseError - w opisie podane jest, że zwraca błędy podczas parsowania pliku - podsunie ktoś jakiś obrazek jak to z grubsza wykorzystać ? Bo nie spodziewam się błędów - nie chodzi o to, że zrobiłbym "bezbłędnie" ale chodzi mi o to, że nie wiem jakie mogą to być błędy ?

2

Czy klasa QJsonArray służy do przechowywania ustawień w pamięci komputera ? (jeden z moich pomysłów)

Mniej więcej tak samo jak Porsche służy do jeżdżenia po bułki. Gubisz po drodze kilka warstw abstrakcji.

Czyli mogę wczytać format pliku JSON za pomocą tej klasy, załadować zawartość do tablicy za pomocą klasy QJsonArray i dokonać zmian, potem zapisać do pliku

tak

klasa QJsonParseError - w opisie podane jest, że zwraca błędy podczas parsowania pliku - podsunie ktoś jakiś obrazek jak to z grubsza wykorzystać ? Bo nie spodziewam się błędów - nie chodzi o to, że zrobiłbym "bezbłędnie" ale chodzi mi o to, że nie wiem jakie mogą to być błędy ?

Np. błąd parsowania

Ogółem QJsonObject/Value/Array reprezentują podstawowe typy danych przechowywane przez json, a Document to klasa reprezentująca dokument json.

0

@kq:

Mniej więcej tak samo jak Porsche służy do jeżdżenia po bułki. Gubisz po drodze kilka warstw abstrakcji.

jakie warstwy gubię ?

1

json to format przechowywania danych, klasy QJson... służą do jego obsługi, a nie do przechowywania ustawień. To, do czego wykorzysta je programista jest zupełnie osobną kwestią.

0

no tak się domyślam, że to obsługuje cały format JSON - ale mi chodzi o to, że chcę wiedzieć czy moje myślenie jest poprawne w sensie "składania klocków" np zamiast używać tradycyjnych tablic do wczytywania wartości mam obiekt typu QJsonArray i mogę to wykorzystać, zamiast wynajdywać koło na nowo - mniej więcej chodzi mi o styl myślenia - nie wiem jak to ująć abyś mnie zrozumiał co mam na myśli

2

no tak się domyślam, że to obsługuje cały format JSON - ale mi chodzi o to, że chcę wiedzieć czy moje myślenie jest poprawne w sensie "składania klocków" np zamiast używać tradycyjnych tablic do wczytywania wartości mam obiekt typu QJsonArray i mogę to wykorzystać, zamiast wynajdywać koło na nowo - mniej więcej chodzi mi o styl myślenia - nie wiem jak to ująć abyś mnie zrozumiał co mam na myśli

No nie do końca. Wczytujesz bajty z pliku, tworzysz z tego QJsonDocument, modyfikujesz dane i z powrotem zapisujesz bajty do pliku. Plik wynikowy ma ściśle zdefiniowany format, który możesz sobie edytowac w dowolnym edytorze i kolejne odpalanie aplikacji poradzi sobie ze zmianą danych. Natomiast QJsonArray to klasa reprezentujące jeden z typów wspieranych przez JSONa.

Zaletą stosowania JSONa do trzymania konfiguracji jest pominięcie parsowania formatu plików, bo ten jest już narzucony i zaimplementowany.

3

JSON

QJsonValue reprezentuje wartość. Tą wartością może być tekst, liczba, tablica, obiekt lub predefiniowane true, false, null.
QJsonObject to zbiór wartości.
QJsonArray to po prostu tablica,takie vector<QJsonValue>
QJsonDocument to taki jsonowy main.

zkubinski napisał(a):
  1. klasa QJsonParseError - w opisie podane jest, że zwraca błędy podczas parsowania pliku - podsunie ktoś jakiś obrazek jak to z grubsza wykorzystać ? Bo nie spodziewam się błędów - nie chodzi o to, że zrobiłbym "bezbłędnie" ale chodzi mi o to, że nie wiem jakie mogą to być błędy ?

JSON jest formatem tekstowym. Każdy bez problemu może go edytować najzwyklejszym notatnikiem a co za tym idzie, może np. zapomnieć o oddzieleniu wartości przecinkiem czy o zamykającej klamrze. Parser to wykryje a QJsonParseError poda Ci informacje co konkretnie jest nie tak.

0

Zrobiłem sobie taki kod - jest to kod testowy aby się nauczyć obsługiwać zestawem klas QJson*

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QVariant>
#include <QDebug>

using namespace std;

int main()
{
    QJsonObject object
    {
        {"obiekt1","tekst obiektu jeden"},
        {"obiekt2",2}
    };

    qDebug()<< object.value("obiekt1").toString();
    qDebug()<< object.value("obiekt2").toInt();

    QJsonArray array
    {
        {"tablica1",123, "asd", 2.2}
    };

    for(int i=0; i<array.size(); ++i){
        qDebug()<< i << "-" << array.toVariantList().value(i).toString();
    }

    QJsonObject object2
    {
        {"tablica", array},
        {"obiekt1","tekst obiektu jeden"},
        {"obiekt3", object}
    };

    QFile saveFile("jonson.json");

    if(!saveFile.open(QIODevice::ReadWrite | QIODevice::Text)){
        qDebug()<< "nie mozna otworzyc bufora pliku";
    }

    QJsonDocument document(object2);
    saveFile.write(document.toJson());

    return 0;
}

natomiast w pliku pojawia mi się coś takiego

{
    "obiekt1": "tekst obiektu jeden",
    "obiekt3": {
        "obiekt1": "tekst obiektu jeden",
        "obiekt2": 2
    },
    "tablica": [
        "tablica1",
        123,
        "asd",
        2.2
    ]
}

w związku z powyższym mam pytanie.

Dlaczego klasa QJsonDocument nie zapisuje według kolejności w jakiej zapisałem QJsonObject object2 ?

0

A dlaczego ma trzymać tę kolejność? Klucze są unikalne, JSON nie definiuje kolejności ich trzymania.

0

Dlaczego klasa QJsonDocument nie zapisuje według kolejności w jakiej zapisałem

Gdyż standard **JSON **nic nie mówi na temat kolejności zapisu, która jest nieokreślona. Wewnętrznie jest prawdopodobnie realizowane za pomocą struktury mapy, która wybrana została tak aby zmaksymalizować wydajność, kosztem niezachowania kolejność.

0

@kq:

A dlaczego ma trzymać tę kolejność? Klucze są unikalne, JSON nie definiuje kolejności ich trzymania.

@TomaszLiMoon

Gdyż standard JSON nic nie mówi na temat kolejności zapisu, która jest nieokreślona. Wewnętrznie jest prawdopodobnie realizowane za pomocą struktury mapy, która wybrana została tak aby zmaksymalizować wydajność, kosztem niezachowania kolejność.

Więc mam rozumieć, że wyszukiwanie opcji ustawień programu odbywa się na podstawie klucza i nie ma znaczenia kolejność zapisu danych do pliku ?

0

Jeśli szukasz np. klucza w jsonie, np listen/port to tak.

0

@kq:

Jeśli szukasz np. klucza w jsonie, np listen/port to tak.

a jeżeli bym szukał NIE na podstawie klucza ? Tzn czy istnieje jakaś inna metoda na wyszukiwanie ?

0

Możesz iterować po parach klucz-wartość. Kolejność pojawienia się kluczy jest nieznana, może różnić się od tej w danych wejściowych

0

@kq:

Możesz iterować po parach klucz-wartość. Kolejność pojawienia się kluczy jest nieznana, może różnić się od tej w danych wejściowych

Czy możesz podać przykład takiej iteracji ?

0
void walk_json_obj(QJsonObject const& obj) {
    for(auto const& elem : obj) {
        qDebug() << elem.key() << elem.value();
    }
}

pisane z palca, ale powinno działać

1 użytkowników online, w tym zalogowanych: 0, gości: 1