无法解析从 iOS 中的 PHP 获取的 JSON

Posted

技术标签:

【中文标题】无法解析从 iOS 中的 PHP 获取的 JSON【英文标题】:Can't parse JSON get from PHP in iOS 【发布时间】:2014-04-10 12:06:02 【问题描述】:

我正在开发一个应用程序,该应用程序需要向 Web 服务发送请求并为下一个流程获取 JSON。我正在使用AFNetworking 进行请求。以下是我的 php 代码

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

上面的代码我已经验证过了,打印出来的结果没问题。

["userID":"xxx"]

然后,我使用AFNetworking 发送对这个 Json 数据的请求,如下所示

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);
];

NSLog 正确显示了JSON 数据,但将JSON 解析为 NSDictionary 的下一行将导致崩溃,输出如下所示

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'

所以你可以看到 NSLog(@"%@",responseObject);实际上是在显示正确的东西。顺便说一句,我也试过了

[NSJSONSerialization isValidJSONObject:responseObject];

验证responseObject,结果也是有效的。

有什么帮助吗?

【问题讨论】:

因为你是从服务中获取数组所以获取 NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];然后得到 NSDictionary *dictT = [arr objectAtIndex:0];然后执行 NSLog("%@",dictT)。 【参考方案1】:

AFNetworking 已经为您反序列化了responseObject,因此您无需使用NSJSONSerialization

崩溃是因为您将反序列化的NSArray 传递给NSJSONSerialization,而它需要NSData

另外,当你这样做时:

NSDictionary *dictionary = [NSJSONSerialization ...

反正你不会得到字典,你会得到一个数组。你应该有:

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

(显然你需要检查users数组count

另外,当您使用isValidJSONObject: 时,您的使用方式是错误的。它验证对象是否可以转换为 JSON,而不是对象是否可以从 JSON 转换。

【讨论】:

非常感谢!你是对的,AFNetworking 已经为我反序列化了 JSON。现在我可以从 responseObject 中获取用户 ID。但是,当我尝试从 [users objectAtIndex:0] 等 NSArray 用户那里获取用户 ID 时,它再次导致崩溃。相反,I use NSDictionary *users = [responseObject objectAtIndex:0] 然后它适用于 '[users objectForKey:@"userID"]`

以上是关于无法解析从 iOS 中的 PHP 获取的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

ios+php中的json解析

如何从 iOS 中的文件中解析 JSON? [关闭]

通过 Ajax 解析 PHP 文件获取的 JSON 数据时出现问题

使用 SwiftyJSON iOS 解析 JSON 响应

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?

js解析php返回的json数据无法获取length的问题分析