Ios 单对象json解析-我做错了什么?
这肯定是我做错了什么。我一直把头撞在墙上,想弄清楚到底发生了什么事。我已经在android版本的应用程序中完成了json解析,现在试图在xcode中解析这个简单的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
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作为该变量的键?谢谢所有的帮助,但我们在上面的答案中找到了答案!你们太棒了!我尝试了不同的东西,但语法是错误的。你能给我一个例子说明你是什么吗