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++ 的に書き方があっているかは若干不安。