Я сделал метод sqlquery в своем приложении, который в основном получает команду SQL и возвращает результат в json, проблема в том, что это создает неправильные jsons при заполнении «и другие проблемные символы ..
Я попытался сначала создать 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, либо просто текстом ошибки. Таким образом, вы фактически смешиваете разные типы наборов результатов в одном языковом типе — 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();
}
Я бы предложил использовать правильную реализацию Json для правильного экранирования кавычек и т. Д.
Если вы используете Qt5: Qt5 поставляется с QJsonDocument в комплекте как часть qtbase.
Если вы используете Qt4: встроенной поддержки Json нет, но вы можете использовать сторонние библиотеки, такие как qjson.
Если вы действительно не можете использовать правильную библиотеку, вы можете сделать это самостоятельно и вручную убрать специальные символы (Вот список).
Например.
QString escapeForJson(QString s) {
s = s.replace(QLatin1String("\""), QLatin1String("\\\"));
…
return s;
}