0

非常に長い話ですが、私はAndroidアプリを持っていて、それを開発するためにcocos2dxを使用しました。私が取り組んでいるコンポーネントの1つは、Facebookの友達をゲームに参加させることです。私がそれをした方法は、ネイティブ側(java)でした。FacebookSDKをセットアップしました。ログインに成功し、友達リストを問題なくプルダウンしました。私の問題は、このデータをc ++側に転送して、データにアクセスしてラベルなどに取り込む必要があることです。

ここでは、Javaネイティブ-アクティビティの開始、Facebookへのログイン、友達の取得-> STRING DATA JNI TO C++->CPPがJannsonを使用してJSONデータを解析します。

私の問題は、次のようなサンプルデータがある場合です。

[
    {
        "pic_square": "https://www.facebook.com/blah",
        "uid": 4654546445,
        "name": "somename"
    }
]

私はそれを問題なく解析できますが、実際にはFacebookの応答は次のようになります。

{
    Response: responseCode: 200,
    graphObject: GraphObject{
        graphObjectClass=GraphObject,
        state={
            "data": [
                {
                    "pic_square": "https://www.facebook.com/blah",
                    "uid": 4654546445,
                    "name": "somename"
                }
            ]
        }
    }
}

そして、それでJanssonは、それが配列ではないと述べて失敗します(正確なエラーは「エラー:ルートは配列ではありません」です)。これを処理する方法がわかりません。どういうわけか、「データ」の後にあるものを解析する必要があります。次に、どこで正しく停止するか、またはより良い方法があるかを判断します。

ありがとう!!

4

1 に答える 1

1

必要なのは、解析ロジックを変更して、関心のある配列をラップするJsonオブジェクトを最初に処理するdataことです。これには追加のプログラミングが必要になりますが、文字列操作の試みよりも確実に優れています。「[」と「]」が常に応答の一部であると100%確信していない限り、私はあなたが受け取っているものについて何の仮定もしません。

Jannsonについてはよくわかりませんが、data配列を処理する前に、他のいくつかのことを実行する必要があります。チュートリアルを見るだけで、おそらく次のようになります。

// make request
text = request(url);
// decode json
root = json_loads(text, 0, &error);

// parse "Response"
json_t *response = json_object_get(root, "Response");
json_t *responseCode = json_object_get(response, "responseCode");
int responseCodeValue = json_integer_value(responseCode);

// parse "graphObject"
json_t *graphObject = json_object_get(root, "graphObject");
json_t *graphObjectClass = json_object_get(graphObject, "graphObjectClass");
json_t *state = json_object_get(graphObject, "state");
json_t *data = json_object_get(state, "data");

// iterate over the "data" array, parse the key/values etc.
for(i = 0; i < json_array_size(data); i++) {
    json_t *data = json_array_get(root, i);
}

この例のために、すべての型チェック(自分で追加する必要があります)と、メモリ/変数のクリーンアップを省略しました。また、タイプミスや明らかな間違いに注意してください。これはブラウザに直接入力しただけで、コンパイルや実行時のチェックは行いませんでした。自分でそれらを除外できると確信しています。

私が興味を持っていることの1つは、なぜJannsonを選んだのかということです。AndroidとiOSの両方をサポートしているためだと思いますか?特にAndroidをターゲットにしている場合は、他にもたくさんのオプションがあります。たとえば、基本的なJsonサポートはAndroidフレームワークに組み込まれていますが、 GSONJacksonなどのJavaオブジェクトへのJsonのマッピングを可能にするサードパーティライブラリもあります。

于 2013-03-25T00:18:02.283 に答える