Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Zmeishe
21 / 21 / 0
Регистрация: 31.08.2016
Сообщений: 174
1

QJsonValue + QJsonDocument->toJson()

10.07.2019, 09:42. Просмотров 1842. Ответов 4
Метки нет (Все метки)

Qt 5.7.1

Формирую QJsonDocument и выгружаю в QByteArray функцией toJson( QJsonDocument::Indented ) класса QJsonDocument



всё отлично, пока не встречаются числа больше миллионе и заканчивающиеся нулями.
Например, 1000000, 2000000, 3000000

В этом случае при выгрузке в текст получаю: 1e+06, 2e+06, 3e+06
Если задать 3000001, то всё будет в порядке.

QJsonValue все числа для хранения приводит к типу double и так хранит.
При явном выводе toInt() - выводит правильно 3000000,
но
qDebug() << QJsonValue(3000000); выводит QJsonValue(double, 3e+06)
через toJson( QJsonDocument::Indented ) тоже 3e+06;

Как это обойти?
Или может быть уже исправлено в более новых версиях чем Qt5.7.1 ? Подскажите.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2019, 09:42
Ответы с готовыми решениями:

Сломался QJsonValue
Привет всем! Пользуюсь Qt 5.1. Документация говорит, что в этом классе есть метод int toInt()....

QJsonValue в Qt5
Не подскажете QJsonValue представляет из себя JSON в Qt 5 да? А если у меня есть класс с какими то...

QJsonValue не работает
Здравствуйте! Есть программа на Qt, ей несколько лет, работала в Qt 4.6, 5.3, a сегодня в 5.11...

Пустой QJsonDocument
Появилась такая проблема: Работаю с VK API. С помощью QNetworkAccessManager получаю список друзей...

Использование QJsonDocument::fromRawData. Где взять размер данных?
Здравствуйте! Не получается обработать документ json: pluginFilename =...

4
Lolobotik
278 / 87 / 37
Регистрация: 10.06.2015
Сообщений: 261
10.07.2019, 10:10 2
Может быть уже исправлено в более новых версиях чем Qt5.7.1
Это вроде как особенность вывода и QJsonDocument ни при чём. Что тут по-твоему править нужно?

Цитата Сообщение от Zmeishe Посмотреть сообщение
Как это обойти?
Смотря куда ты выводишь эти числа. Для qDebug(), например, так:
C++ (Qt)
1
2
qDebug() << fixed << qSetRealNumberPrecision(2) << 400000000.0;
qDebug() << fixed << qSetRealNumberPrecision(2) << QJsonValue(30000000);
0
Zmeishe
21 / 21 / 0
Регистрация: 31.08.2016
Сообщений: 174
10.07.2019, 10:27  [ТС] 3
Цитата Сообщение от Lolobotik Посмотреть сообщение
Смотря куда ты выводишь эти числа
Вывожу весь Json документ в текст штатной функцией Qt5 класса QJsonDocument
toJson( QJsonDocument::Indented )
и отправляю в API контрольно-кассового аппарата.

Формировать весь документ врукопашную, по байтно - как-то не комильфо.
А штатная функция по формату вывода своё мнение выпячивает.
0
Lolobotik
278 / 87 / 37
Регистрация: 10.06.2015
Сообщений: 261
10.07.2019, 13:09 4
Попробуй посмотреть что выведет. Может и правда, что с версией поменяли. Там вроде целая эпопея с JSON.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   QByteArray jsonArray("{\"name\": \"Molecule Man\","
                         "\"age\": 2000000000,"
                         "\"secretIdentity\": \"Dan Jukes\","
                         "\"powers\": [\"Radiation resistance\","
                         "\"Turning tiny\","
                         "\"Radiation blast\"]}");
 
 
 
    QJsonDocument testDocument = QJsonDocument::fromJson(jsonArray);
    if(testDocument.isNull())
    {
        qDebug() << "Всё плохо";
    }
    else
    {
        QByteArray resultArray;
        resultArray = testDocument.toJson();
        qDebug() << resultArray;
        foreach(const QString& key, testDocument.object().keys())
        {
            QJsonValue value = testDocument.object().value(key);
            qDebug() << key <<": " << value;
        }
    }
У меня вроде как всё храниться как надо и при преобразовании в строку не теряется. Проблема только с выводом через qDebug(), елси то, что я выше писал не делать.
С Qt 5.9.2 вывод такой:
Кликните здесь для просмотра всего текста
"{\n "age": 2000000000,\n "name": "Molecule Man",\n "powers": [\n "Radiation resistance",\n "Turning tiny",\n "Radiation blast"\n ],\n "secretIdentity": "Dan Jukes"\n}\n"
"age" : QJsonValue(double, 2e+09)
"name" : QJsonValue(string, "Molecule Man")
"powers" : QJsonValue(array, QJsonArray(["Radiation resistance","Turning tiny","Radiation blast"]))
"secretIdentity" : QJsonValue(string, "Dan Jukes")


PS. А в исходном тексте документа то всё в экспоненциальном виде или обычном?
1
Zmeishe
21 / 21 / 0
Регистрация: 31.08.2016
Сообщений: 174
11.07.2019, 13:35  [ТС] 5
Попробовал, вывод такой:

"{\n "age": 2e+09,\n "name": "Molecule Man",\n "powers": [\n "Radiation resistance",\n "Turning tiny",\n "Radiation blast"\n ],\n "secretIdentity": "Dan Jukes"\n}\n"

"age" : QJsonValue(double, 2e+09)
"name" : QJsonValue(string, "Molecule Man")
"powers" : QJsonValue(array, QJsonArray(["Radiation resistance","Turning tiny","Radiation blast"]))
"secretIdentity" : QJsonValue(string, "Dan Jukes")

Собственно, разница видна. Функция testDocument.toJson() в Qt 5.9.2 отработала правильно, а у меня в Qt 5.7.1 нет.

Пробую обновиться.

Добавлено через 28 минут
На одном из компов нашёл уже установленную Qt 5.13.0
Она в строку вывела всё правильно.без всяких 2e+09
Однозначно, обновлять надо.
0
11.07.2019, 13:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2019, 13:35

Какой тип имеет переменная, если её значение null? QJsonDocument
{a: &quot;тип QString&quot;, b: 10, // определяет как double c: null // а здесь какой typeName() ? } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.