2013-08-05 4 views
1

기본적으로 SQL 명령을 가져 와서 json에서 결과를 반환하는 응용 프로그램에서 sqlquery 메서드를 만들었습니다. 문제는 "및 기타 문제가있는 문자로 채울 때 잘못된 jsons를 만듭니다.json에서 QT SqlQuery 반환

은 내가 JSON으로 직렬화 한 후 처음있는 QObject를 만들려고하지만, 그것을 달성 할 수 없다.

방법이 방법은 심지어 "표시를 포함하는 데이터와 유효한 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() ; 
} 

} 

솔루션 : 나는 따옴표 등 권리의 탈출을 얻을 수있는 적절한 JSON 구현을 사용하는 것이 좋을 것

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

: 답변에

덕분에이 올바른 방법입니다.

Qt5를 사용하는 경우 : Qt5는 qtbase에 QJsonDocument 번들로 제공됩니다.

Qt4를 사용하는 경우 : 내장 된 Json 지원은 없지만 qjson과 같은 타사 라이브러리를 사용할 수 있습니다.

정말로 적절한 lib를 사용할 수 없다면 직접 해보고 특수 문자를 수동으로 이스케이프 처리 (Here's a list)하십시오.

예.

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