Blackberry 10 での Json の扱い方について
Blackberry OS 10 のネイティブアプリ開発で Json を扱うことがあったのでメモ
C++ で Json を扱う場合、Cascades framework にある JsonDataAccess を用いるのが簡便だと思います。
Qt の対応バージョンが 4.8 で、Qt5.5? で追加された Json サポートを利用することができないためです。
使おうと思えば Qt5 も使えるようなので、その場合は Qt の Json サポートを利用するのがよいかもしれません。
qml で使用する場合は、JSON.parse() で行けるはず。
Parse
QString jsonData = ....
JsonDataAccess jda;
QVariant var = jda.loadFromBuffer(jsonData);
// map
QVariantMap map = var.value<QVariantMap>();
// list
QVariantList list = var.value<QVariantList>();
レスポンスとして Json が返ってくる場合、このような使い方になります
QVariantMap ApiRequest::onRequestFinished(QNetworkReply* reply)
{
if (reply && reply->error() == QNetworkReply::NoError) {
const QByteArray buffer(reply->readAll());
JsonDataAccess jda;
QString jsonData = "hogehoge";
QVariant var = jda.loadFromBuffer(jsonData);
QVariantMap map = var.value<QVariantMap>();
...
}
}
Stringify
QVariantMap map;
map["hoge"] = "hogehoge";
JsonDataAccess jda;
QByteArray jsonString;
jda.saveToBuffer(QVariant(map), &jsonString);
POST リクエストとか送る時はこんな感じ
void ApiRequest::request(QString username, QString password, QString factorKey) { QNetworkRequest request; request.setUrl(QUrl("http://cordea.jp")); connect(mManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onRequestFinished(QNetworkReply*))); QVariantMap map; map["hoge"] = "hogehoge"; JsonDataAccess jda; QByteArray body; jda.saveToBuffer(QVariant(map), &body); mManager->post(request, body); }
c++ 的に書き方があっているかは若干不安。