Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单对象json解析-我做错了什么?_Ios_Objective C_Json_Xcode_Nsdictionary - Fatal编程技术网

Ios 单对象json解析-我做错了什么?

Ios 单对象json解析-我做错了什么?,ios,objective-c,json,xcode,nsdictionary,Ios,Objective C,Json,Xcode,Nsdictionary,这肯定是我做错了什么。我一直把头撞在墙上,想弄清楚到底发生了什么事。我已经在android版本的应用程序中完成了json解析,现在试图在xcode中解析这个简单的json,但无法完成 NSError *myError = nil; NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&myError]; NSLog([res ob

这肯定是我做错了什么。我一直把头撞在墙上,想弄清楚到底发生了什么事。我已经在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"}]
提前感谢您在这个问题上提供的任何帮助。我试图简化这篇文章,但如果需要更多的信息,我会尝试并迅速提供


JSONObjectWithData
正在返回字典数组,而不是字典。您打印的原始JSON确认了这一点:

[{“日期”:“2016-06-17T22:56:33.0811255-05:00”}//这是一个数组

但是,您试图将响应对象视为字典。这样做是在数组上调用字典方法(
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...
}

JSONObjectWithData
正在返回字典数组,而不是字典。您打印的原始JSON确认了这一点:

[{“日期”:“2016-06-17T22:56:33.0811255-05:00”}//这是一个数组

但是,您试图将响应对象视为字典。这样做是在数组上调用字典方法(
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设置为
[NSDictionary]
。然后选择该数组中的第一个元素,然后获取
objectForKey:“Date”
。正常的JSON数据以
{
开头,这是以
[
开头的。这意味着它是一个数组

您可以在屏幕截图中看到它,当它显示@:1元素时,然后显示1个键/值对。NSDictionary位于数组中。NSError

请尝试以下代码:

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

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

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

您可以在屏幕截图中看到它,当它显示@:1元素时,然后显示1个键/值对。NSDictionary位于数组中。NSError

请尝试以下代码:

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

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


我正在与@Fogmeister进行对话,但当我添加图像时,对话历史记录消失。请显示异常消息。无法识别的选择器表示您调用了对象上的情绪,但该方法不存在。异常消息将显示哪个对象和哪个方法。所附的图像是针对对象的由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFArray objectForKey:]:未识别的选择器发送到实例0x7c1a25c0'这就是您所要求的吗?我正在与@Fogmeister进行对话,但当我添加图像时,对话历史记录消失。请显示异常消息。未识别的选择器表示您调用了对象的情绪,但该方法不存在。异常消息将l显示哪个对象和哪个方法。所附的图像用于对象资源。**由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFArray objectForKey:]:未识别的选择器发送到实例0x7c1a25c0'这就是您所要求的吗?那么您是说my res对象实际上是一个字典数组?那么我如何引用数组中的第一个字典呢?我已经使用了不同版本的res[0]和res[0][@“Data”]但是什么都没用。是的,这正是我要说的。我会在一秒钟内发布更多的代码。我在NSLog(firstItem)上得到以下错误;--由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFDictionary\u fastCStringContents:]:发送到instanceI的无法识别的选择器在firstitem初始化时放入断点,我得到的responseObject[0]值与上面的res图像相同。我修改了代码,在其中抛出了一些额外的日志语句,(1)确认您得到的是数组而不是字典,然后(2)在访问第一项之前,请确认您的数组不是空的。那么您是说my res对象实际上是一个字典数组?那么我如何引用数组中的第一个字典呢?我已经使用了不同版本的res[0]和res[0][@“Data”]但是什么都没用。是的,这正是我要说的。我会在一秒钟内发布更多的代码。我在NSLog(firstItem)上得到以下错误;--由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFDictionary\u fastCStringContents:]:发送到instanceI的无法识别的选择器在firstitem初始化时放入断点,我得到的responseObject[0]值与上面的res图像相同。我修改了代码,在其中抛出了一些额外的日志语句,(1)确认您得到的是数组而不是字典,然后(2)在访问第一项之前,请确认您的数组不是空的。我正在尝试不同的方法,但语法错误。您能给我一个您所说的示例吗?我用一些您应该尝试的代码更新了我的答案。我没有在Objective-C中尝试过这一点,因为我只知道Swift。但请告诉我它是如何工作的。我尝试重新设置[0]但我得到了错误:在NSDictionary类型的对象上找不到读取数组元素的预期方法。嗯…很抱歉,这似乎是语法问题。我对此一无所知。作为最后的手段,您能否尝试设置res[0]作为一个变量,然后调用object作为该变量的键?谢谢所有的帮助,但我们在上面的答案中找到了答案!你们太棒了!我尝试了不同的东西,但语法是错误的。你能给我一个例子说明你是什么吗