2013-06-12 37 views
0

我正在为iPhone编写本机应用程序,我对这个主题很陌生。
使用AFNetworking我请求(与POST)并处理JSON回复。
但我注意到,一旦JSON响应更为复杂:AFNetworking和compex 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代码语法错误,我不得不从多个功能收集代码。

谢谢。

+1

您应该向我们展示您用于访问revInfoList和commentsList的代码。从你已经显示的这两个列表是不清楚的,因为你的评论暗示 –

+0

@TimDean我正在查看DEBUG中的'responseObject'。我看到'revInfoList'键和3个空数组。所以这个问题似乎比访问密钥的代码更基础。 – thedp

+1

你看到3个“空”数组的事实告诉我,JSON解析器在这里正确地做了一些事情(因为你在revInfolist下有3个孩子)。他们应该是NSDictionary对象,而不是NSArray对象,所以我想知道你在“DEBUG”中看到的是什么(我认为你的意思是你在XCode的调试器中查看它)。它是否显示3个类型为NSArray的对象恰好是空的?根据你在调试器中的看法,它可能根本不是3个空数组。 –

回答

1

AFNetworking使用NSJSONSerialization将您的JSON转换为基础对象,通常是NSDictionary或NSArray。 NSJSONSerialization严格遵守RFC 4627

你张贴的JSON响应是有效的JSON,所以只有3个原因,我能想到的行为你描述:

  1. 你的服务器返回一个不同的有效载荷比你张贴在这里的一个
  2. 您的服务器编码的有效载荷错误
  3. 你是不正确有关什么xxx的NSDictionary包含

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

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

+0

谢谢你的洞察力。一旦我开始了解我发现问题的步骤。正如你所说,一切都应该工作,而且确实如此。只有一次我打印了'responseString'的描述,我注意到XCode调试器是我浪费时间的来源。一切都在那里,但调试器太麻烦显示所有的信息。当我打印“xxx”的描述时,它就在那里。我学到了一些新东西。非常感谢你:) – thedp

+0

这很奇怪。您可能想要发布一个关于该问题的单独问题。您可以在目标的Build Settings中查看您的“优化级别”设置 - 如果未设置为“none”,编译器可能会丢弃它所知道永远不会被访问的数据。我建议在调试过程中将此设置保留为“无”。 –