CORDEA blog

Android applications engineer

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