Qt的QSqlQuery如何返回JSON格式数据

3
我在我的应用程序中创建了一个 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();
}
2个回答

5

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

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

}


谢谢!我想出了如何按照我所想的实现它。有两处更正:json.setObject 应该改为 json.setArray,而 push_back 到 for 循环中应该在循环外,但在 while 循环中。我已经将更正后的代码添加到原始帖子中。再次感谢。 - Vincent Duprez

1
我建议使用适当的Json实现来正确获取引号等字符的转义。
如果您正在使用Qt5:Qt5作为qtbase的一部分捆绑了QJsonDocument
如果您正在使用Qt4:没有内置的Json支持,但是您可以使用第三方库,例如qjson
如果您真的不能使用适当的库,您可以手动转义特殊字符(这里有一个列表)。
例如。
QString escapeForJson(QString s) {
    s = s.replace(QLatin1String("\""), QLatin1String("\\\"));
    …
    return s;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接