在 JSON 中编码 QString
Encoding a QString in JSON
我正在尝试将 QString 编码为 JSON 字符串,以便我可以通过 QWebFrame::evaluateJavaScript(QString("o.text = %1;").arg(???))
.
安全地注入它
例如,在 php 中使用函数 json_encode
echo json_encode('HELLO "me"');
输出将是
"HELLO \"me\""
这是 Json 对象中字符串的内部表示。
以同样的方式,使用 Qt,我如何在 Json 格式化字符串中检索字符串的内部表示,因为它将被编码为一个值?
真的没有那么难。首先使用 QJsonObjects
构建结构
QJsonObject obj;
obj.insert("tag1", QString("Some text"));
然后用QDocument得到一个Json格式的字符串
QJsonDocument doc(obj);
QByteArray data = doc.toJson(QJsonDocument::Compact);
QString jsonString(data);
这将产生一个字符串,其形式为:-
{ "tag1" : "Some Text" }
将项目分成列表,按“:”拆分
QStringList items = jsonString.split(':', QString::SkipEmptyParts);
列表中应该有 2 个项目,第二个是 Json 字符串的值部分
"Some Test"}
去掉最后的'}'
QString 值 = items[1].remove('}');
当然,您需要进行错误检查,并注意如果原始字符串中有“:”或“}”,则需要先检查它们。
原始答案没有正确处理字符串内部的 :
和 }
。使用数组的类似方法只需要剥离 []
:
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)
我正在尝试将 QString 编码为 JSON 字符串,以便我可以通过 QWebFrame::evaluateJavaScript(QString("o.text = %1;").arg(???))
.
例如,在 php 中使用函数 json_encode
echo json_encode('HELLO "me"');
输出将是
"HELLO \"me\""
这是 Json 对象中字符串的内部表示。
以同样的方式,使用 Qt,我如何在 Json 格式化字符串中检索字符串的内部表示,因为它将被编码为一个值?
真的没有那么难。首先使用 QJsonObjects
构建结构QJsonObject obj;
obj.insert("tag1", QString("Some text"));
然后用QDocument得到一个Json格式的字符串
QJsonDocument doc(obj);
QByteArray data = doc.toJson(QJsonDocument::Compact);
QString jsonString(data);
这将产生一个字符串,其形式为:-
{ "tag1" : "Some Text" }
将项目分成列表,按“:”拆分
QStringList items = jsonString.split(':', QString::SkipEmptyParts);
列表中应该有 2 个项目,第二个是 Json 字符串的值部分
"Some Test"}
去掉最后的'}'
QString 值 = items[1].remove('}');
当然,您需要进行错误检查,并注意如果原始字符串中有“:”或“}”,则需要先检查它们。
原始答案没有正确处理字符串内部的 :
和 }
。使用数组的类似方法只需要剥离 []
:
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)