Objective C如何从嵌套的JSON中读取

时间:2014-03-24 18:52:26

标签: ios arrays json xcode nested

我必须从嵌套的JSON中读取一些值,我无法正确读取它们。 JSON看起来像这样:

 "addons" : [
      {
        "group_title" : "Veggie Toppings",
        "group_type" : "T",
        "item_id" : "29",
        "addon" : [
          {
            "id" : "31",
            "item_title" : "Ham"
          },
          {
            "id" : "32",
            "item_title" : "Mushrooms"
          }
        ]
      },
      {
        "group_title" : "Meat Toppings",
        "group_type" : "T",
        "item_id" : "33",
        "addon" : [
          {
            "id" : "30",
            "item_title" : "Sausage"
          }
        ]
      }

我的代码是:

-(void)setData:(NSMutableDictionary *)menuItems{
    self.menuItem = menuItems;
    // [GSDVActivityIndicator stopWithID:kNotificationHello];
    self.dictionaryOrder = [NSMutableDictionary dictionaryWithDictionary:[self.menuItem valueForKey:@"order"]];
    self.arrayPrices = [NSArray arrayWithArray:[self.menuItem valueForKey:@"price"]];
    self.arrayAddons = [NSArray arrayWithArray:[self.menuItem valueForKey:@"addons"]];
    self.myAddons = [NSArray arrayWithArray:[self.arrayAddons valueForKey:@"addon"]];

    [self setViewGUIData];

    NSLog ( @"addons= %@", [self.arrayAddons valueForKey:@"Group_title]);

    NSLog ( @"addon = %@", [self.myAddons valueForKey:@"item_title"]);

}

结果是:

2014-03-24 19:48:04.446 [3698:70b] addons= (
    "Veggie Toppings",
    "Meat Toppings"
)
2014-03-24 19:48:04.447 [3698:70b] addon = (
        (
        Ham,
        Mushrooms
    ),
        (
        "Sausage"
    )
)

问题出在第二部分,其中包括火腿,蘑菇和香肠等物品。格式错误,我无法读取它们并将它们放入标签中。显然这条线很糟糕:

self.myAddons = [NSArray arrayWithArray:[self.arrayAddons valueForKey:@"addon"]];

但我不知道如何纠正它。

感谢。

2 个答案:

答案 0 :(得分:1)

您正在做的是正常工作。 " addon"的值是[{"id" : "31", "item_title" : "Ham"}, {"id" : "32", "item_title" : "Mushrooms"}]{"id" : "30","item_title" : "Sausage"},因此valueForKey会为您提供一个包含这两个值的数组。

你不能确切地说出你想要的格式,但我猜你想要一个平面列表。你可以创建一个数组,遍历组,并放入每个插件:

NSMutableArray* addons = [NSMutableArray array];
NSArray* groups = [self.menuItem valueForKey:@"addons"];
[groups enumerateObjectsUsingBlock:^(NSDictionary* group, NSUInteger idx, BOOL *stop) {
    NSArray* addonsInThisGroup = group[@"addon"];
    [addonsInThisGroup enumerateObjectsUsingBlock:^(NSDictionary* addon, NSUInteger idx, BOOL *stop) {
        [addons addObject:addon];
    }];
}];

这将导致:

[
    {"id" : "31", "item_title" : "Ham"}, 
    {"id" : "32", "item_title" : "Mushrooms"}, 
    {"id" : "30","item_title" : "Sausage"}
]

答案 1 :(得分:1)

JSONKit添加到项目文件中,并将JSON字符串转换为dictionay对象。 让我们假装你的json数据存储在一个名为" responseString"的变量中。 你必须这样做:

        NSArray *addons = [[NSArray alloc] init];
        addons = [[responseString objectFromJSONString] objectForKey: @"addons"];

现在,在您的数组插件中,您将拥有带有键的字典对象" group_title"," group_type"," item_id"和#34; addon"。使用键" addon"你将拥有一个包含键和#34; id"和" item_title"。