0

私は iPhone 用のネイティブ アプリケーションを作成しています。
AFNetworking を使用して (POST で) 要求し、JSON 応答を処理します。
しかし、JSON 応答がより複雑になると気付きました。

{
    "isFound": "YES",
    "timestamp": "2013-06-12 22:46:47",
    "screenTitle": "Perla Review",
    "placeName": "Perla",
    "placeUniqueId": "101",
    "placeCategory": "PUB",
    "username": "@jim",
    "userImgURL": "",
    "gender": "male",
    "infoMsg": "TBD",
    "youLike": "Like",
    "likesInfoMsg": "",
    "revInfoList": [
        {
            "type": 0,
            "data": "",
            "text": ""
        },
        {
            "type": 1,
            "data": "2",
            "text": ""
        },
        {
            "type": 2,
            "data": "3",
            "text": ""
        }
    ],
    "commentsList": []
}

次に、AFNetworking は、サブ配列 (revInfoList & commentsList) の読み取りと構築に失敗します。
何か間違ったことをしていますか、それとも AFNetworking はそのような json 構造をサポートしていませんか?

データを要求して応答を処理するための私の目的の C コードは次のとおりです。

static NSString *const myAPIBaseURL = @"http://somedomain.com/api/";

NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:myAPIBaseURL]];
NSString *reqPath = @"review/review_fullinfo";

// prepare params
NSString *reqData_loginUsername = [[[Storage_Modal alloc] init] getLoginUsername];
NSString *reqData_currentCoordinatesLat = [[NSNumber numberWithDouble:[appDelegateInst.myCurrentLocation coordinate].latitude] stringValue];
NSString *reqData_currentCoordinatesLon = [[NSNumber numberWithDouble:[appDelegateInst.myCurrentLocation coordinate].longitude] stringValue];

NSString *reqData_reviewUniqueId = reviewUniqueId;

NSDictionary *parameters = [[NSDictionary alloc] initWithObjectsAndKeys:
                            @"json", @"format",
                            reqData_loginUsername, @"loginUsername",
                            reqData_currentCoordinatesLat, @"currentCoordinatesLatitude",
                            reqData_currentCoordinatesLon, @"currentCoordinatesLongitude",
                            reqData_reviewUniqueId, @"reviewUniqueId",
                            nil];

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"application/json"];

[client postPath:reqPath parameters:parameters 
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSDictionary *xxx = responseObject;
        // 'xxx' contains all the top level keys and values, but the sub arrays are empty... why?

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {

         NSLog(@"SERVER ERROR: %@", error);
     }

**注: Objective-C コードに構文エラーがある場合はご容赦ください。複数の関数からコードを収集する必要がありました。

ありがとうございました。

4

1 に答える 1

1

AFNetworking は、NSJSONSerializationを使用して、JSON を Foundation オブジェクト (通常は NSDictionary または NSArray) に変換します。NSJSONSerialization はRFC 4627に厳密に準拠しています。

投稿した JSON 応答は有効な JSON であるため、説明した動作について考えられる原因は 3 つだけです。

  1. あなたのサーバーは、ここに投稿したものとは異なるペイロードを返しています
  2. サーバーがペイロードを正しくエンコードしていません
  3. xxxNSDictionary に含まれるものについてあなたは間違っています

とプロパティを調べることで、#1 をテストできAFJSONRequestOperationます。#2 と #3 はどちらも、オブジェクトを注意深く検査することでテストできます。これらのオブジェクトの出力をここに投稿すると、より適切な診断に役立ちます。responseStringresponseDataxxx

AFNetworking コードと予想される JSON はどちらも問題ないように見えるので、AFNetworking の問題ではないと思います。

于 2013-06-13T14:35:53.750 に答える