首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析JSON - SBJsonParser的问题

解析JSON - SBJsonParser的问题
EN

Stack Overflow用户
提问于 2011-10-28 03:17:47
回答 1查看 3.7K关注 0票数 0

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

现在,我解析的JSON如下所示。

代码语言:javascript
复制
[
   {
      "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,并为公司节点(?)填充正确的信息。

但是,当涉及到relations存储节点时,我的问题就出现了。

代码语言:javascript
复制
 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上面返回的内容。

代码语言:javascript
复制
 relations: (
    {
    store =         (
                    {
            "brief_description" = "<null>";
            id = 1;
            "restaurant_name" = Dubai;
        },
                    {
            "brief_description" = "<null>";
            id = 2;
            "restaurant_name" = Test2;
        }
    );
 }
)

现在,如果不是因为NSLog发生的事情,这就没问题了。看起来,singleStore实际上并不是要获取单独的存储节点,而是将两个存储节点相加在一起。

代码语言:javascript
复制
Single Store: (
    {
    "brief_description" = "<null>";
    id = 1;
    "restaurant_name" = Dubai;
    },
    {
    "brief_description" = "<null>";
    id = 2;
    "restaurant_name" = Test2;
    }
)

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

任何帮助将非常感谢使存储节点分离。

按要求编辑,用于解析的整个代码:

代码语言:javascript
复制
        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的元素。这,我不认为,是相关的,当我试图实现当涉及到如何分裂单一商店字典。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-28 03:50:18

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

代码语言:javascript
复制
NSDictionary *object = [parser objectWithString:[response asString] error:nil];

应:

代码语言:javascript
复制
NSArray *object = [parser objectWithString:[response asString] error:nil];

我会使用companies而不是object作为变量名。

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

如果您使用的是-objectForKey:而不是-valueForKey:,那么您在运行程序时就会注意到这个结构错误。

考虑到这两点,您可以如下所示导航JSON数据:

代码语言:javascript
复制
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 objectForKey键值编码编程指南,然后再使用-valueForKey:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7924769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档