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

Posted

技术标签:

【中文标题】Objective C如何从嵌套的JSON中读取【英文标题】:Objective C how to read from nested JSON 【发布时间】:2014-03-24 18:52:25 【问题描述】:

我必须从嵌套的 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"]];

但我不知道如何纠正它。

谢谢。

【问题讨论】:

在第二个 nslog 中,您有“itemtitle”,但字典中的键是:“item_title”,它是如何工作的? 键名是我的母语,所以我为这篇文章编辑了它们,但这不是问题,它在 Xcode 中有效,我只是在这篇文章中拼错了。 【参考方案1】:

您所做的工作正常。 “插件”的值是["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"
]

【讨论】:

非常感谢:D 现在我得到了插件 = (Ham, Mushrooms, "Ameci Sausage") 你知道为什么火腿和蘑菇没有引号吗? 在控制台中显示字符串时,只有在需要时才会使用引号。 Ameci Sausage 得到它们是因为它有空间。【参考方案2】:

将JSONKit 添加到您的项目文件中,并将 JSON 字符串转换为字典对象。 让我们假设您的 json 数据存储在一个名为“responseString”的变量中。 你只需要这样做:

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

现在,在您的数组插件中,您将拥有带有键“group_title”、“group_type”、“item_id”和“addon”的字典对象。在带有键“addon”的对象中,您将拥有一个由两个字典对象组成的数组,键为“id”和“item_title”。

【讨论】:

以上是关于Objective C如何从嵌套的JSON中读取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SBJson 和 Objective-C 解析和提取嵌套的 JSON 响应

获取嵌套的自定义字段 JSON Objective C

如何从嵌套的 json 中读取字段?

Objective-C:如何读取 JSON?

Objective-C:从 JSON 文件读取远程通知太慢

Objective-C:如何在 JSON 中读取 JSON?