C++ i json

Odpowiedz Nowy wątek
2015-02-07 13:27
0

Witam, mam pytanie gdyż chcę w QT narysować kształty (co nie jest problemem) ale o kolorach pobranych z pliku .json (nie miałem z nim do czynienia). Mam plik json:

 {
    "colorsArray":[{
            "red":"#f00",
            "green":"#0f0",
            "blue":"#00f",
            "cyan":"#0ff",
            "magenta":"#f0f",
            "yellow":"#ff0",
            "black":"#000"
        }
    ]
}

I teraz moje pytanie, jak najelepiej (najprościej) było by zrobić, że funkcja losowała mi kolor z tego pliku i użyła go do rysowania? Lub może lepszą opcją jest pobranie tych kolorów i zapisanie do tablicy w c++ i wtedy losowanie?

Pozostało 580 znaków

2015-02-07 13:31
0

Jeśli masz losować kolor z tych zadanych w jsonie to i tak musisz najpierw przeczytać te kolory i trzymać (choćby przez chwilę) w lokalnym cache. Zatem nie rozumiem w czym problem ;/

Pozostało 580 znaków

2015-02-07 13:39
0

Ok, rozumie. Więc rzecz polega na tym, żeby odczytać fajnie te dane do QT? Mam Qt 4.8.4, więc da się to zrobić bo chyba json jest od 5.0?

a czemu nie masz najnowszego? - gośćabc 2015-02-07 14:43

Pozostało 580 znaków

2015-02-07 13:45
0

Użyj biblioteki do jsona, np. https://github.com/gaudecker/qt-json albo jsoncpp.
Albo napisz własny parser jsona wzorując się na jsmn (http://zserge.com/jsmn.html).

edytowany 1x, ostatnio: satirev, 2015-02-07 13:52

Pozostało 580 znaków

2015-02-07 14:19
0

Ok, zrobiłem według bibliteki z json tego z gita. Mniej więcej rozumiem, jak to działa, tylko jak chcę na przykładzie zobaczyć w moim QT to mi wywala błąd:

89bd28bf9e.png

Co jest przyczyną?

edytowany 1x, ostatnio: choracy69, 2015-02-07 14:19

Pozostało 580 znaków

2015-02-07 18:05

Qt 5 ma wsparcie dla JSon-a.
http://doc.qt.io/qt-5/qjsondocument.html#fromJson

void MainWindow::readJsonFormFile(const QString &fileName)
{
    QFile file(fileName);
    if (file.open(QFile::ReadOnly)) {
        QByteArray data = file.readAll();
        QJsonDocument doc = QJsonDocument::fromJson(data);
        if (doc.isObject()) {
            if (doc.object()["colorsArray"].isArray()) {
                QJsonArray array = doc.object()["colorsArray"].toArray();
                QJsonObject colorMap = array[0].toObject();
                processColorMap(colorMap);
            }
        }
    }
}

void MainWindow::processColorMap(const QJsonObject &map)
{
    for(QJsonObject::const_iterator i=map.begin(); i!=map.end(); ++i) {
        QString colorName = i.value().toString();
        QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
        item->setData(Qt::DisplayRole, i.key());
        item->setData(Qt::ForegroundRole, QBrush(QColor(colorName)));
    }
}

Wynik:
9f12fad5dc.png


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2015-02-07 18:09
Zrobiłem tak jak masz powyżej, funkcje wpisałem do mainwindows i chce wywowalć w main.cpp i wyrzuca mi błąd z pliku json: : error: expected unqualified-id before '{' token { ^ A plik json jest ok, więc jak temu zaradzić? - choracy69 2015-02-08 11:59

Pozostało 580 znaków

2015-02-07 18:43
1

polecam boost::property_tree, jak nie możesz użyć QJsonDocument

Pozostało 580 znaków

2015-02-08 12:03
0

Ok. Zrobiłem według Twoich funkcji i wyrzuca mi błąd:

error: expected unqualified-id before '{' token
 {
 ^

W czym tkwi problem?

Mam colors.json:

{
    "colorsArray":[{
            "red":"#f00",
            "green":"#0f0",
            "blue":"#00f",
            "cyan":"#0ff",
            "magenta":"#f0f",
            "yellow":"#ff0",
            "black":"#000"
        }
    ]
}

oraz wywołanie w main.cpp:

MainWindow w;
    w.show();
    w.readJsonFormFile(colors.json);

Z góry dzięki za pomoc

Pozostało 580 znaków

2015-02-08 14:46
0

Dobra już problem rozwiązany. Stworzyłem listWidget tylko, że nie wyświetla mi się nic :/

bardzo dziwne, bo w zasadzie to jest prawie cały kod jaki napisałem, reszta jest wyklinana lub wygenerowana przez Qt Creator. A debugowałeś czemu nie działa? - MarekR22 2015-02-09 09:25

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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