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 包含的内容不正确

您可以通过查看您AFJSONRequestOperation的 'responseStringresponseData属性来测试 #1。#2 和 #3 都可以通过xxx仔细检查对象进行测试。如果您在此处发布这些对象的输出,我们可以帮助您更好地诊断。

您的 AFNetworking 代码和预期的 JSON 看起来都很好,所以我认为这不是 AFNetworking 的问题。

于 2013-06-13T14:35:53.750 回答