Iphone iOS字典错误

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

我在这里解析一个JSON并正确地获取数据。但是,当我尝试将信息放入NSDictionary并让用户读取时,我会遇到此错误

'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”中,即使没有数组/字典问题,这也是一个技巧。是的,你说得对,对我来说太晚了;)反正代码行和我说的一样;)原因也是一样的,只是它不是我想象中的数组;)