2013-03-01 121 views
0

我有困难,从多级阵列中提取字典被声明为多级阵列中提取的字典:使用indexPath.row

NSArray *menuItems;,看起来像这样:

Table =  (
       { 
      MENUDESC = "HOME   "; 
      MENUID = 1072; 
      NAVIGATETO = "content.aspx?item=1072&pid=0"; 
      NAVIGATETO2 = "default.aspx?item=1072&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = "PRODUCTS &amp; SERVICES"; 
      MENUID = 1073; 
      NAVIGATETO = "#"; 
      NAVIGATETO2 = "default.aspx?item=1073&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = "ABOUT US"; 
      MENUID = 1074; 
      NAVIGATETO = "content.aspx?item=1074&pid=0"; 
      NAVIGATETO2 = "default.aspx?item=1074&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = "WHAT SETS US APART"; 
      MENUID = 1075; 
      NAVIGATETO = "content.aspx?item=1075&pid=0"; 
      NAVIGATETO2 = "default.aspx?item=1075&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = "CASE STUDIES"; 
      MENUID = 1126; 
      NAVIGATETO = "content.aspx?item=1126&pid=0"; 
      NAVIGATETO2 = "default.aspx?item=1126&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = "REQUEST PROPOSAL"; 
      MENUID = 1076; 
      NAVIGATETO = "content.aspx?item=1076&pid=0"; 
      NAVIGATETO2 = "default.aspx?item=1076&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     }, 
       { 
      MENUDESC = CONTACT; 
      MENUID = 1077; 
      NAVIGATETO = "contactus.aspx?item=1077&pid=0"; 
      NAVIGATETO2 = "contactus.aspx?item=1077&pid=0"; 
      PARENTMENUID = "<null>"; 
      PROTECTED = "<null>"; 
      parentmenuid2 = "<null>"; 
     } 
    ); 
} 

从创建JSON看起来像这样:

{ 
    "Table": [ 
    { 
     "MENUID": 1072.0, 
     "MENUDESC": "HOME   ", 
     "PARENTMENUID": null, 
     "NAVIGATETO": "content.aspx?item=1072&pid=0", 
     "NAVIGATETO2": "default.aspx?item=1072&pid=0", 
     "PROTECTED": null, 
     "parentmenuid2": null 
    }, 
    { 
     "MENUID": 1073.0, 
     "MENUDESC": "PRODUCTS &amp; SERVICES", 
     "PARENTMENUID": null, 
     "NAVIGATETO": "#", 
     "NAVIGATETO2": "default.aspx?item=1073&pid=0", 
     "PROTECTED": null, 
     "parentmenuid2": null 
    }, 
    { 
     "MENUID": 1074.0, 
     "MENUDESC": "ABOUT US", 
     "PARENTMENUID": null, 
     "NAVIGATETO": "content.aspx?item=1074&pid=0", 
     "NAVIGATETO2": "default.aspx?item=1074&pid=0", 
     "PROTECTED": null, 
     "parentmenuid2": null 
    }, 
    { 
     "MENUID": 1075.0, 
     "MENUDESC": "WHAT SETS US APART", 
     "PARENTMENUID": null, 
     "NAVIGATETO": "content.aspx?item=1075&pid=0", 
     "NAVIGATETO2": "default.aspx?item=1075&pid=0", 
     "PROTECTED": null, 
     "parentmenuid2": null 
    }, 
] 
} 

我通过他们用它来提取字典的示例代码工作:

NSDictionary *items = [menuItems objectAtIndex:indexPath.row]; 

但是,这是行不通的 - 我得到一个错误“无效的选择器发送”。我尝试了各种方式来访问数组中的数据。但是我发现的所有研究和答案都没有帮助。

我需要从它创建NSString的是这样的:

NSString *text = [[menuItems objectForKey:@"Table"] objectForKey:@"MENUDESC"]; 
NSString *name = [[menuItems objectForKey:@"Table"] objectForKey:@"MENUID"]; 
+0

添加菜单项数组的内容在你的问题。 – 2013-03-01 08:18:42

+0

你为什么认为'menuItems'是一个数组? – 2013-03-01 08:20:16

+0

它被声明为一个数组,所以我无法使用indexForKey访问它: – Jimmypooza 2013-03-01 08:22:15

回答

1

使用下面的代码:

NSLog(@"%@",[[[menuItems objectForKey:@"Table"] objectAtIndex:0] objectForKey:@"MENUDESC"]); 

NSLog(@"%@",[[[menuItems objectForKey:@"Table"] objectAtIndex:0] objectForKey:@"MENUID"]); 

这将只返回第一个数组:您还可以通过使用for Loop:

得到所有值
2

Objective-C是一种相当动态的语言,所以即使您将menuItems声明为NSArray,也不能保证它s类型在运行时。如果您从您的问题中反序列化JSON对象,并将其分配给menuItems,则实际上您正在为其分配一个NSDictionary实例。请注意,JSON的最外层的symobls是大括号,表示一个对象(它转换为NSDictionary),而不是方括号,表示一个数组。该对象有一个关键字Table,其中有一个数组作为关联值。

所以你需要做的是这样的:

NSArray *menuItems = JSONObject[@"Table"]; 

哪里JSONObject是你目前分配给menuItems。之后,menuItems指向一组字典,每个字典都应该能够为您提供所需的字符串。

1

也就是说,通过JSON字符串发送给您的内容。 它以包含在{}中的键值对开始。它只有一个条目。该条目的关键是“表”,它的值是一个数组,它包装了许多对象。数组的对象包含在[]中。 Witin数组是一组键/值对(包含在{}中)。

所以每个{}将被转换成一个NSDictionary,它是键值对的适当容器。每一个[],甚至是空的,都会被转换成对象的NSArray。

你永远无法确定你收到了什么。因此,你应该总是仔细检查接收到的值是否NSArray,NSDictionary,NSString或NSNumber。 (我不知道NSDate的,坦率地说。) 做到这一点的使用(例如)

if ([myCurrentObject isKindOfClass[NSString class]]) { 
    // process the data 
} else { 
    // react to the error because you were expecting a string and got something else 
} 

这样,你给你的应用程序正常反应,即使它不能处理数据的机会。这比你目前观察到的未捕获的异常导致的异常要好得多。

准备接收空数组和字典。对于dictionarys来说并不困难。如果密钥不存在,objectForKey:等将简单地返回nil。但是当数组中没有任何对象时,objectAtIndex:0会抛出无效的参数异常。因此,请确保您检查收到的物体的长度和存在。

if (menuItems && [menuItems isKindOfClass[NSArray class]] && [menuItems count]) ... 

会做。首先检查menuItem是否不为零,然后检查它是否是一个NSArray(或NSMutableArray - 也会被忽略为YES)以及数组是否确实包含任何对象。后者也可以通过适当的循环来实现。 没有必要实际嵌套if语句,因为它开始评估左侧,并且将停止评估当所有条件都与逻辑AND &&连接时发现的第一个NO。

+0

感谢你的回应,我将把它加入到我的代码中。 – Jimmypooza 2013-03-02 10:58:12

+0

这是一个很好的答案,我正在为它添加书签。 – 2013-03-03 06:00:11

0

感谢您的回复,他们真的很有帮助。我改变了对NSArray *menuItems;NSDictionary *menuItems;然后这样做:

NSDictionary *tweet = [[menuItems objectForKey:@"Table"] objectAtIndex:indexPath.row]; 
NSString *text = [tweet objectForKey:@"MENUDESC"]; 
NSString *name = [tweet objectForKey:@"MENUID"]; 

这完美地工作,给了我这样的结果:

2013-03-02 03:00:44.396 App Test[616:c07] HOME    ID:1072 
2013-03-02 03:00:44.396 App Test[616:c07] PRODUCTS &amp; SERVICES ID:1073 
2013-03-02 03:00:44.396 App Test[616:c07] ABOUT US ID:1074 
2013-03-02 03:00:44.397 App Test[616:c07] WHAT SETS US APART ID:1075 
2013-03-02 03:00:44.397 App Test[616:c07] CASE STUDIES ID:1126 
2013-03-02 03:00:44.397 App Test[616:c07] REQUEST PROPOSAL ID:1076 
2013-03-02 03:00:44.397 App Test[616:c07] CONTACT ID:1077 
+0

由于其他用户为您提供了帮助,特别是(根据您的评论判断)Hermann Klecker,接受解决问题的答案很有礼貌。我注意到你的其他问题表明某位用户的帮助,或者答案中指出的内容有帮助,但你没有接受任何答案。所以如果你不知道,我只是让你知道这个网站的这个方面。如果你已经意识到接受的角色,那么请忽略这个评论,我不想强​​迫或唠叨,只是教育。祝你好运。 – 2013-03-03 05:59:27