使用 NSDictionary 访问 NSJSONSerialization 数据

Posted

技术标签:

【中文标题】使用 NSDictionary 访问 NSJSONSerialization 数据【英文标题】:Accessing NSJSONSerialization data using a NSDictionary 【发布时间】:2012-03-17 20:00:52 【问题描述】:

我正在尝试使用 NSJSONSerialization 检索 JSON 数据,问题是我无法正确解析 NSDictionary。

网络服务返回以下内容:

["状态":"无变量"]

我的代码如下所示:

...
NSURL * url = [NSURL URLWithString:@"http://justforexamplepurposes.xyz/file.php"];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[[NSString stringWithFormat:@"username=%@&password=%@", username, password] dataUsingEncoding:NSUTF8StringEncoding]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if(error == nil && result != nil)

    NSError * json_error = nil;
    id id_json_serialization = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingMutableContainers error:&json_error];
    if(json_error == nil)
    
        NSDictionary * dictionary_result = (NSDictionary *) id_json_serialization;
        NSLog(@"|>%@<|", dictionary_result);
        NSEnumerator * enume;
        id key;
        enume = [dictionary_result keyEnumerator];
        while((key =[enume nextObject]))
        
            NSLog(@"%@ : %@", key, [dictionary_result objectForKey:key]);
        
    

...

第一个 NSLog 打印正确:

|>( 状态=“无变量”; )

但是在第二个 NSLog 中,它抛出了一个异常:

2012-03-17 13:57:22.195 TESTAPP[41072:f803] -[__NSArrayM keyEnumerator]:无法识别的选择器发送到实例 0x689a9f0 2012-03-17 13:57:22.196 TESTAPP[41072:f803] * 终止应用程序由于 未捕获的异常 'NSInvalidArgumentException',原因:'-[__NSArrayM keyEnumerator]:无法识别的选择器发送到实例 0x689a9f0' * 第一次抛出调用栈:(0x13e9022 0x157acd6 0x13eacbd 0x134fed0 0x134fcb2 0x2a80 0x13eae99 0x3614e 0x360e6 0xdcade 0xdcfa7 0xdc266 0x5b3c0 0x5b5e6 0x41dc4 0x35634 0x12d3ef5 0x13bd195 0x1321ff2 0x13208da 0x131fd84 0x131fc9b 0x12d27d8 0x12d288a 0x33626 0x232d 0x2295) 终​​止调用抛出异常(lldb)

有什么建议吗?

【问题讨论】:

【参考方案1】:

服务器返回的 JSON 实际上是一个数组,其中只有一个对象。所以你的变量 dictionary_result 实际上是一个 NSMutableArray。

快速提示:如果您使用 CFShow(dictionary_result) 而不是 NSLog(@"|&gt;%@&lt;|", dictionary_result);,您可能已经发现了这一点,因为 CFShow 为您提供了有关对象的更多信息,包括类型。

【讨论】:

我怎样才能正确使用 CFShow(dictionary_result),当我尝试它时,我得到以下错误“Objective-C 指针类型'NSDictionary *'到 C 指针类型'CFTypeRef'的隐式转换(又名'const void *') 需要桥接演员表" 对不起,你可能不得不做CFShow((__bridged CFTypeRef)dictionary_result) 以上评论应该是CFShow((__bridge CFTypeRef)dictionary_result),仅供参考。

以上是关于使用 NSDictionary 访问 NSJSONSerialization 数据的主要内容,如果未能解决你的问题,请参考以下文章

在swift ios中解析NSJSON序列化中的json时出错

NSJSON序列化和表情符号

NSJSON序列化到核心数据

使用 NSDictionary 访问 NSJSONSerialization 数据

如何在 swift 中使用 NSDictionary 访问 JSON 子字段

如何使用保留关键字访问 NSDictionary 元素?