在json中返回QtQSqlQuery

Qt QSqlQuery return in json

本文关键字:QtQSqlQuery 返回 json      更新时间:2023-10-16

我在应用程序中创建了一个sqlquery方法,该方法基本上可以获得SQL命令并以json形式返回结果,问题是当填充"和其他有问题的字符时,会创建无效的json。。

我试图先创建一个QObject,然后将其序列化为JSON,但我无法实现

如何使此方法生成有效的json,即使数据包含"符号?

QString 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();
}

小型设计说明。。我建议重新审查有关错误处理的设计。您从函数返回的QString可以是正确的JSON文档,也可以只是错误文本。因此,您实际上将不同的结果集类型混合在一种语言类型中——字符串。因此,您需要在代码中进行一些额外的检查,以了解实际发生了什么。

问题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();

}

我建议使用适当的Json实现来正确地转义引号等。

如果您使用的是Qt5:Qt5附带了作为qtbase一部分捆绑的QJsonDocument。

如果您使用的是Qt4:没有内置Json支持,但您可以使用第三方库,如qjson。

如果你真的不能使用一个合适的lib,你可以自己做,并手动转义特殊字符(下面是一个列表)。

例如

QString escapeForJson(QString s) {
    s = s.replace(QLatin1String("""), QLatin1String("\"));
    …
    return s;
}