【问题标题】: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”
  • 这是你要求的吗?

标签: ios objective-c json xcode nsdictionary


【解决方案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] 设置为变量,然后在该变量上调用对象作为键吗?
  • 感谢所有帮助,但我们在上面的答案中找到了答案!你们摇滚!
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多