我在我的应用程序中创建了一个sqlquery方法,基本上得到一个SQL命令并在json中返回结果,问题是当填充“和其他有问题的字符时,这会创建错误的jsons ..
我首先尝试创建一个QObject,然后将其序列化为JSON,但无法实现。
如果使用包含“符号?
的数据,如何使此方法生成有效的jsonQString Api::SQLQuery(const QString & sqlquery)
{
QSqlQuery query;
bool firstline = true;
query.setForwardOnly(true);
if(query.exec(sqlquery))
{
QString answer = "[";
while(query.next())
{
if(firstline){firstline = false;}else {answer += ",";}
answer += "{";
for(int x=0; x < query.record().count(); ++x)
{
if(x != 0){answer += ",";}
answer += "\""+query.record().fieldName(x) +"\":\""+ query.value(x).toString()+"\"";
}
answer += "}";
}
answer += "]";
return answer;
}
else
{
return query.lastError().text() ;
}
}
解决方案:
感谢答案,这是正确的方法:
QString Api::SQLQuery(const QString & sqlquery) {
QSqlQuery query;
query.setForwardOnly(true);
if (!query.exec(sqlquery))return QString();
QJsonDocument json;
QJsonArray recordsArray;
while(query.next())
{
QJsonObject recordObject;
for(int x=0; x < query.record().count(); x++)
{
recordObject.insert( query.record().fieldName(x),QJsonValue::fromVariant(query.value(x)) );
}
recordsArray.push_back(recordObject);
}
json.setArray(recordsArray);
return json.toJson();
}
答案 0 :(得分:2)
小设计说明..我建议审查有关错误处理的设计。您正在从函数返回QString,它可以是正确的JSON文档,也可以是错误文本。因此,您实际上在一种语言类型中混合了不同的结果集类型 - String。 因此,您需要在代码中进行一些额外的检查,以了解实际发生的情况。
Qt 5.x样本:
QString Api::SQLQuery(const QString & sqlquery) {
QSqlQuery query;
query.setForwardOnly(true);
if (!query.exec(sqlquery))
return QString();
QJsonDocument json;
QJsonArray recordsArray;
while(query.next()) {
for(int x=0; x < query.record().count(); x++) {
QJsonObject recordObject;
recordObject.insert( query.record().fieldName(x),
QJsonValue::fromVariant(query.value(x)) );
}
recordsArray.push_back(recordObject);
}
json.setArray(recordsArray);
return json.toJson();
}
答案 1 :(得分:1)
我建议使用正确的Json实现来正确转义引号等。
如果您使用的是Qt5:Qt5附带QJsonDocument捆绑为qtbase的一部分。
如果您使用的是Qt4:内置了Json支持,但您可以使用qjson等第三方库。
如果你真的不能使用正确的lib,你可以自己动手并且手动转义特殊字符(Here's a list)。
E.g。
QString escapeForJson(QString s) {
s = s.replace(QLatin1String("\""), QLatin1String("\\\"));
…
return s;
}