解析JSON - SBJsonParser的问题

时间:2011-10-28 03:17:48

标签: objective-c cocoa-touch nsmutablearray nsdictionary sbjson

在使用SBJsonParser解析一些JSON时,我目前遇到了一个奇怪的问题。

现在,我正在解析的JSON如下。

[
   {
      "Company":{
         "id":"1",
         "company_name":null
      },
      "relations":{
         "store":[
            {
               "id":"1",
               "restaurant_name":"Dubai",
               "brief_description":null
            },
            {
               "id":"2",
               "restaurant_name":"Test2",
               "brief_description":null
            }
         ]
      }
   }
]

我可以轻松创建NSDictionary并使用公司 节点(?)的正确信息填充它。

但是我的问题出现在关系商店节点上。

 NSDictionary *relations = [object valueForKey:@"relations"];
 NSArray *multipleStores = [relations valueForKey:@"store"];
 NSLog(@"relations: %@", relations);

 for (NSDictionary *singleStore in multipleStores){

        NSLog(@"Single Store: %@", singleStore);

        [company grabStoreInformation:singleStore];

 }

以上是NSLog的回归。

 relations: (
    {
    store =         (
                    {
            "brief_description" = "<null>";
            id = 1;
            "restaurant_name" = Dubai;
        },
                    {
            "brief_description" = "<null>";
            id = 2;
            "restaurant_name" = Test2;
        }
    );
 }
)

现在,如果不是NSLog中发生的事情,那就没关系了。似乎singleStore实际上并没有获得单个存储节点,而是将两个存储节点一起添加。

Single Store: (
    {
    "brief_description" = "<null>";
    id = 1;
    "restaurant_name" = Dubai;
    },
    {
    "brief_description" = "<null>";
    id = 2;
    "restaurant_name" = Test2;
    }
)

问题是,我需要将每个商店节点添加到NSMutableArray中。因此,NSDictionary将被添加到NSMutableArray中,然后可以在其他地方访问(对于UITableView数据源)。

在将商店节点分开时,将非常感谢任何帮助。

修改 正如所要求的,整个解析代码:

        SBJsonParser *parser = [[SBJsonParser alloc] init];

        // parse the JSON string into an object - assuming [response asString] is a NSString of JSON data
        NSDictionary *object = [parser objectWithString:[response asString] error:nil];

        [parser release];

        NSDictionary *companyDetails = [object valueForKey:@"Company"];

        MACompany *company = [MACompany sharedMACompany];
        [company initWithDetails:companyDetails];

        NSDictionary *relations = [object valueForKey:@"relations"];
        NSArray *multipleStores = [relations valueForKey:@"store"];

        NSLog(@"relations: %@", relations);

        for (NSDictionary *singleStore in multipleStores){

            NSLog(@"Single Store: %@", singleStore);

            [company grabStoreInformation:singleStore];

        }

正如您所看到的,我依靠单例类来复制JSON的元素。我不认为这与我在解决如何拆分单店词典时想要实现的目标有关。

1 个答案:

答案 0 :(得分:1)

首先,请注意您的顶级元素是数组,而不是对象。因此:

NSDictionary *object = [parser objectWithString:[response asString] error:nil];

应该是:

NSArray *object = [parser objectWithString:[response asString] error:nil];

我会使用companies代替object作为变量名称。

其次,使用-valueForKey:时必须小心。发送到数组时,它返回另一个数组,其中包含与key参数对应的值。除非您熟悉键值编码,否则请使用NSDictionary中的规范方法返回与给定键关联的对象:-objectForKey:

如果您使用-objectForKey:代替-valueForKey:,则在运行程序时会注意到此结构错误。

考虑到这两点,您可以按如下方式导航JSON数据:

NSArray *companies = [parser objectWithString:[response asString] error:nil];
for (NSDictionary *company in companies) {
    NSDictionary *companyDetails = [company objectForKey:@"Company"];
    NSDictionary *relations = [company objectForKey:@"relations"];
    NSArray *stores = [relations objectForKey:@"store"];

    for (NSDictionary *store in stores) {
        NSString *restaurantName = [store objectForKey:@"restaurant_name"];
        …
    }

我建议在使用-valueForKey:之前阅读Stack Overflow上的其他问题:Difference valueforKey objectForKeyKey-Value Coding Programming Guide