单对象 json 解析 - 我做错了啥?

Posted

技术标签:

【中文标题】单对象 json 解析 - 我做错了啥?【英文标题】:Single object json parse - what am I doing wrong?单对象 json 解析 - 我做错了什么? 【发布时间】:2016-06-18 21:32:14 【问题描述】:

这一定是我做错了。我一直在用头撞墙,试图弄清楚发生了什么。我已经在我的应用程序的 android 版本中完成了这个 json 解析,现在尝试在 xcode 中解析这个简单的 json 并且无法完成。

NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&myError];  
NSLog([res objectForKey:@"Date"]);

此代码让我收到“无法识别的选择器发送到实例”错误。

这是 json 数据,你可以看到 Date 是对象之一:

["Date":"2016-06-17T22:56:33.0811255-05:00"]

在此先感谢您对此问题的任何帮助。我已尝试简化此帖子,但如果需要更多信息,我会尝试并快速提供。

http://i.stack.imgur.com/Y5fsT.png

【问题讨论】:

我正在与@Fogmeister 进行对话,但当我添加图片时,对话历史记录消失了。 请显示异常信息。无法识别的选择器意味着您已经在对象上调用了一种心情,但该方法不存在。异常消息将显示哪个对象和哪个方法。 所附图片为对象资源。 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFArray objectForKey:]:无法识别的选择器发送到实例 0x7c1a25c0” 这是你要求的吗? 【参考方案1】:

JSONObjectWithData 正在返回一个字典数组而不是字典。您打印出的原始 JSON 证实了这一点:

["Date":"2016-06-17T22:56:33.0811255-05:00"] // This is an array

但是,您试图将该响应对象视为字典。这样做是在数组上调用字典方法 (objectForKey:)。这会导致崩溃。试试这样的:

NSError *error = nil;
id responseObject = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&error];  

if (error) 

    // Handle error

    return;


NSLog(@"%@", responseObject); 

if ([responseObject isKindOfClass:[NSArray class]]) 

    NSArray *responseArray = (NSArray *)responseObject;
    for (id item in responseArray)
    
        NSLog(@"%@", item); 

        if ([item isKindOfClass:[NSDictionary class]])
        
            NSDictionary *dictionary = (NSDictionary *)item;
            NSString *dateString = [dictionary objectForKey:@"Date"];
            NSLog(@"%@", dateString);
        
    

else 

    // responseObject is not an array...

【讨论】:

所以你是说我的 res 对象真的是一个字典数组?那么我怎样才能引用数组中的第一个字典呢?我玩过 res[0] 和 res[0][@"Data"] 的不同版本,但没有任何效果。 是的,这正是我要说的。我将在几秒钟内发布更多代码。 我在 NSLog(firstItem) 上收到以下错误; -- 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSCFDictionary _fastCStringContents:]:无法识别的选择器发送到实例 我在 firstitem 初始化时设置了一个断点,得到的 responseObject[0] 值与上面的 res 图像相同。 我修改了代码,在其中添加了一些额外的日志语句并 (1) 确认您得到的是一个数组而不是字典,然后 (2) 在访问第一项之前确认您的数组不为空.【参考方案2】:

我很确定这是因为您应该首先将 res 设置为 [NSDictionary]。然后选择该数组中的第一个元素,然后获取objectForKey: "Date"。普通 JSON 数据以 开头,它以 [ 开头。这意味着它是一个数组。

您可以在屏幕截图中看到 @: 1 Element 。然后它说 1 个键/值对。 NSDictionary 在数组中。NSError

试试这个代码:

*myError = nil;
[NSDictionary] *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&myError];

if (res.count > 0)    
NSLog([res[0] objectForKey:@"Date"]);

【讨论】:

我正在尝试 diff 的东西,但语法错误。你能给我举个例子吗? 我用一些你应该尝试的代码更新了我的答案。我没有在 Objective-C 中尝试过,因为我只知道 Swift。但请告诉我结果如何。 我试图 res[0] 但我收到错误:在 NSDictionary 类型的对象上找不到读取数组元素的预期方法。 嗯...抱歉,但这似乎是一个语法问题。我一无所知的东西。作为最后的手段,您可以尝试将 res[0] 设置为变量,然后在该变量上调用对象作为键吗? 感谢所有帮助,但我们在上面的答案中找到了答案!你们摇滚!

以上是关于单对象 json 解析 - 我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个 AFNetworking JSON 帖子我做错了啥?

(Swift3)可以返回完整的 JSON 文件,但我无法返回特定值,我做错了啥?

实现 data.sort 按标题对 json 进行排序,不断收到“未定义”错误。不知道我做错了啥

我正在尝试在 PL/SQL 中解析 XML。我无法从标签中检索属性值,我做错了啥?

矩形跨域请求。我做错了啥?

以编程方式将 UIButton 添加到 rootview,我做错了啥?