2013-08-05 142 views
1

我在我的应用程序中做了一个基本上得到一个SQL命令并返回结果在json中的sqlquery方法,问题是这会在填充“和其他有问题的字符时创建错误的jsons ..”QT SqlQuery在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

小设计说明..我会建议审查有关错误处理的设计。你从你的函数返回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(); 

}

+0

谢谢!我想出了如何按照我的想法来实现它。 2更正:json.setObject应该是json.setArray,并且for循环中的push_back应该在循环外部,但是在while循环中。我在原始文章中添加了更正的代码。再次感谢。 –

1

我会建议使用合适的Json实施,获得报价等权的转义。

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

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

如果你真的不能使用正确的库,你可以自己做,并手动转义特殊字符(Here's a list)。

E.g.

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