Кодирование QString в JSON

Я пытаюсь закодировать QString в строку JSON, чтобы я мог безопасно вводить ее через QWebFrame::evaluateJavaScript(QString("o.text = %1;").arg(???)).

Например, в php с помощью функции json_encode

echo json_encode('HELLO "me"');

Результат будет

"ЗДРАВСТВУЙ, \"я\""

Это внутреннее представление строки в объекте Json.

Точно так же, используя Qt, как я могу получить внутреннее представление строки, поскольку оно будет закодировано как значение в строке в формате Json?


person TesX    schedule 08.06.2015    source источник
comment
Используйте классы QJson Qt, такие как QJsonDocument, QJsonObject и т. д.   -  person TheDarkKnight    schedule 08.06.2015
comment
Как я могу использовать QJSonDocument для кодирования одной строки QString? Он принимает либо QJsonArray, либо QJsonObject, но не QJsonValue... Или я что-то упустил?   -  person TesX    schedule 08.06.2015


Ответы (2)


Это действительно не так сложно. Начните с создания структуры с помощью QJsonObjects.

QJsonObject obj;
obj.insert("tag1", QString("Some text"));

Затем используйте QDocument, чтобы получить строку в формате Json.

QJsonDocument doc(obj);
QByteArray data = doc.toJson(QJsonDocument::Compact);

QString jsonString(data);

Это создаст строку в виде: -

{ "tag1" : "Некоторый текст" }

Разделите элементы в список, разбивая на ':'

QStringList items = jsonString.split(':', QString::SkipEmptyParts);

В списке должно быть 2 элемента, второй из которых является разделом значения строки Json.

"Некоторый тест"}

Удалите последний '}'

Значение QString = элементы[1].remove('}');

Конечно, вам нужно будет выполнить проверку ошибок и знать, что если у вас есть ':' или '}' в исходной строке, вам нужно будет сначала проверить их.

person TheDarkKnight    schedule 09.06.2015
comment
Я думаю, вы неверно истолковали мою просьбу. :) Мне нужна строка, закодированная в JSON, чтобы можно было безопасно вставить ее в строку. Попробуйте запустить этот код echo json_encode('HELLO "me"'); здесь: phptester.net - person TesX; 09.06.2015
comment
Пробовал на том сайте, не получилось - результат пустой. - person TheDarkKnight; 09.06.2015
comment
Он работает с этим интерпретатором, и я понимаю, что вы имеете в виду. Ваш вопрос очень плохо сформулирован! - person TheDarkKnight; 09.06.2015
comment
Э... Извините за мой английский... :P - person TesX; 09.06.2015
comment
Спасибо, это сработало. Однако я изменил вызов remove('}') на этот .remove(QRegularExpression("\\}$")); - person TesX; 10.06.2015

Исходный ответ неправильно обрабатывает : и } внутри строки. Аналогичный подход с использованием массива, который требует только удаления []:

QString encodeJsonStringLiteral(const QString &value)
{
    return QString(
                QJsonDocument(
                    QJsonArray() << value
                ).toJson(QJsonDocument::Compact)
           ).mid(1).chopped(1);
}

ab"c'd становится "ab\"c'd"

Или, если вам не нужны двойные кавычки вокруг строки, замените на .mid(2).chopped(2)

person Zmey    schedule 15.08.2019