3

基本的に SQL コマンドを取得し、json で結果を返すアプリケーションで sqlquery メソッドを作成しました"

最初に作成してからQObjectJSONにシリアル化しようとしましたが、達成できません。

"標識を含むデータであっても、このメソッドで有効な 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();
}
4

2 に答える 2

4

小さな設計上の注意..エラー処理に関する設計を見直すことをお勧めします。関数から QString を返していますが、これは適切な JSON ドキュメントまたは単なるエラー テキストのいずれかです。したがって、実際には、1 つの言語タイプ (文字列) 内で異なる結果セット タイプを混在させます。そのため、実際に何が起こったのかを理解するために、コード内で追加のチェックを行う必要があります。

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

}

于 2013-08-05T20:55:48.893 に答える
1

適切な Json 実装を使用して、引用符などを正しくエスケープすることをお勧めします。

Qt5 を使用している場合: Qt5 には、qtbaseの一部として QJsonDocument がバンドルされています。

Qt4 を使用している場合: Json サポートは組み込まれていませんが、qjsonなどのサードパーティ ライブラリを使用できます。

本当に適切なライブラリを使用できない場合は、自分でそれを行い、特殊文字を手動でエスケープできます (リストはこちら)。

例えば

QString escapeForJson(QString s) {
    s = s.replace(QLatin1String("\""), QLatin1String("\\\"));
    …
    return s;
}
于 2013-08-05T14:04:47.810 に答える