ds342222222 2014-04-10 12:06
浏览 89
已采纳

无法在iOS中解析来自PHP的JSON get

I'm developing an app that needs to send request to web service and obtain JSON for the next process. I'm using AFNetworking for the request. Following is my PHP code

$data = array(
            array(
                'userID' => 'xxx'
            )
        );
echo json_encode($data);

I've already verified the above code, and the result printed is fine.

[{"userID":"xxx"}]

Then, I use AFNetworking to send a request for this Json data as below

NSDictionary *parameters = @{@"action": @"verifyUDID", @"UDID": udid};

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

[manager POST:@"http://roommateradar.com/RoommateRadarAPI.php"  
         parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

             NSLog(@"%@",responseObject);
             NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

The NSLog is correctly show the JSON data, but the next line which is parsing JSON to NSDictionary will cause a crash, the output is like below

2014-04-10 21:59:56.893 RoommateRadar[2941:60b] (
        {
        userID = xxx;
    }
)
2014-04-10 21:59:56.893 RoommateRadar[2941:60b] -[__NSCFArray bytes]: unrecognized selector sent to instance 0x1493e660
2014-04-10 21:59:56.895 RoommateRadar[2941:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray bytes]: unrecognized selector sent to instance 0x1493e660'

So you can see that the NSLog(@"%@",responseObject); is actually showing correct thing. BTW, I also tried

[NSJSONSerialization isValidJSONObject:responseObject];

to verify the responseObject, the result is also valid.

Any little help?

  • 写回答

1条回答 默认 最新

  • douzhonglong3789 2014-04-10 12:10
    关注

    AFNetworking already deserialises the responseObject for you, so you don't need to use NSJSONSerialization.

    The crash is because you are passing the deserialised NSArray to NSJSONSerialization when it expects NSData.

    Also, when you do:

    NSDictionary *dictionary = [NSJSONSerialization ...
    

    you would not get a dictionary anyway, you would get an array. You should just have:

    NSArray *users = (NSArray *)responseObject;
    NSDictionary *user = [users objectAtIndex:0];
    

    (obviously you need to check the users array count)

    Also, when you use isValidJSONObject:, you're using it the wrong way round. It verifies if an object can be converted into JSON, not if the object can be converted from JSON.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题