Iphone iOS字典错误
我在这里解析一个JSON并正确地获取数据。但是,当我尝试将信息放入NSDictionary并让用户读取时,我会遇到此错误Iphone iOS字典错误,iphone,ios,json,cocoa-touch,nsdictionary,Iphone,Ios,Json,Cocoa Touch,Nsdictionary,我在这里解析一个JSON并正确地获取数据。但是,当我尝试将信息放入NSDictionary并让用户读取时,我会遇到此错误 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1cda3d50' 这是密码 if (data != nil) { NSDictionary *res = [NSJSONSerializ
'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1cda3d50'
这是密码
if (data != nil) {
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
NSDictionary *dic = [[res objectForKey:@"data"] objectForKey:@"current_condition"];
self.location = [[dic objectForKey:@"request"]objectForKey:@"query"];
}
你知道这里出了什么问题吗?谢谢
编辑
这是我登录NSDictionary*res时得到的结果
data = {
"current_condition" = (
{
cloudcover = 100;
humidity = 86;
"observation_time" = "11:11 PM";
precipMM = "2.2";
pressure = 1019;
"temp_C" = 1;
"temp_F" = 34;
visibility = 8;
weatherCode = 296;
weatherDesc = (
{
value = "Light rain";
}
);
weatherIconUrl = (
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
}
);
winddir16Point = SSW;
winddirDegree = 210;
windspeedKmph = 15;
windspeedMiles = 9;
}
);
request = (
{
query = "North Massapequa, United States Of America";
type = City;
}
);
}
您的JSON对象可能包含一个数组,您希望在其中找到一个字典(您将
objectForKey:
发送到一个数组对象)
尝试将JSON转储到某个地方,并确保它的格式符合预期
编辑:从转储中可以看到,res[@“request”]
是一个数组(它有()
)。因此,您正在对请求
数组调用objectForKey:@“query”
,并崩溃
请尝试
self.location=[[res objectForKey:@“request”]objectAtIndex:0]objectForKey:@“query”]代码>取而代之。-[\uu NSCFArray objectForKey:]:无法识别的选择器
-您可以在这里看到,很明显,您试图在数组上调用objectForKey:
在这里:
dic
是一个阵列:
data = {
"current_condition" = ( // <--- array
但是request
也是一个数组,您仍然会得到完全相同的错误…您误解了NSDictionary
日志的输出,我认为这是一个长期存在的错误
输出如下所示:
data = {
"current_condition" = (
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
humidity = 86;
"observation_time" = "11:11 PM";
precipMM = "2.2";
pressure = 1019;
"temp_C" = 1;
"temp_F" = 34;
visibility = 8;
weatherCode = 296;
weatherDesc =
(
{
value = "Light rain";
}
);
weatherIconUrl =
(
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
}
);
winddir16Point = SSW;
winddirDegree = 210;
windspeedKmph = 15;
windspeedMiles = 9;
}
);
}
这将隐藏数据的实际形状。请参见数据、当前状况、weatherDesc等行中=后的长中断?这里应该有一个换行符,因此输出如下所示:
data = {
"current_condition" = (
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
humidity = 86;
"observation_time" = "11:11 PM";
precipMM = "2.2";
pressure = 1019;
"temp_C" = 1;
"temp_F" = 34;
visibility = 8;
weatherCode = 296;
weatherDesc =
(
{
value = "Light rain";
}
);
weatherIconUrl =
(
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
}
);
winddir16Point = SSW;
winddirDegree = 210;
windspeedKmph = 15;
windspeedMiles = 9;
}
);
}
()表示一个数组。(是的,尽管[]在其他地方被使用。这个输出既陈旧又易变,我怀疑苹果能否在不破坏代码的情况下修复它,即使他们突然认为它很重要。)
这显示了数据的真实形状:current\u condition
是一个数组。字典是数组中的第一个(索引0)对象,而不是数组本身
在整个数据中,如下所示:
data = {
"current_condition" = (
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
data =
{
"current_condition" =
(
{
cloudcover = 100;
humidity = 86;
"observation_time" = "11:11 PM";
precipMM = "2.2";
pressure = 1019;
"temp_C" = 1;
"temp_F" = 34;
visibility = 8;
weatherCode = 296;
weatherDesc =
(
{
value = "Light rain";
}
);
weatherIconUrl =
(
{
value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0033_cloudy_with_light_rain_night.png";
}
);
winddir16Point = SSW;
winddirDegree = 210;
windspeedKmph = 15;
windspeedMiles = 9;
}
);
}
适当调整您的代码以获得额外的间接寻址级别,您应该不会有问题。请发布输入JSON的示例。你真的在数据中有一本字典的字典吗?问题是你没有一本NSDICTIONARY。您从某个应用程序复制了代码,该应用程序“期望”JSON的外部实体是一个“对象”(字典),但您的代码实际上是一个数组。找一个不同的来源进行复制,或者花15分钟的时间来研究和理解它。“当前条件”是一个数组,与day一样清晰。(而“请求”不在“当前条件”中,而是外部字典中的一个单独项。)请注意,通过在代码中放置一些nslog并研究输出,可以轻松调试整个过程。JSON很容易用NSLog调试。我只是将其作为NSDictionary记录,它显示了我需要的所有键,错误发生在以下行NSDictionary*dic=[[res objectForKey:@“data”]objectForKey:@“current_condition”];self.location=[[dic objectForKey:@“请求”]objectForKey:@“查询”]@ChrisLoonam--错误消息显示您有一个NSArray。变量类型为“NSDictionary”的事实无法改变这一事实。要真正查看JSON结构,我喜欢使用以下方式打印NSData:NSLog(@“%@”,[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);然后将其粘贴到一个编辑器中,对JSON进行格式化,以便查看结构。如果它的结构是数组,那么JSONObjectWithData将不使用字典,而是使用NSArray。或NSLog生成的NSObjects。一个数组打印时带有()
括号,但在其他方面,输出看起来非常像“打印得很好”的JSON。是的,您也可以通过调试器查看所需的信息。不管怎样,你似乎需要理解JSON的格式,以及JSON序列化的具体使用方法。实际上,他并没有做到这一点。“current_condition”也是一个数组。是的,但这不是问题所在,因为他没有调用it@HotLicks事实上,问题是我在当前条件下试图获取请求密钥时犯了一个错误,所以问题不是你说的他试图从“当前条件”中获取“请求”,如果“request”不在“current_condition”中,即使没有数组/字典问题,这也是一个技巧。是的,你说得对,对我来说太晚了;)反正代码行和我说的一样;)原因也是一样的,只是它不是我想象中的数组;)