解析 NSArray 的 NSDictionary

Posted

技术标签:

【中文标题】解析 NSArray 的 NSDictionary【英文标题】:Parsing of NSDictionary of NSArray 【发布时间】:2015-09-11 10:49:46 【问题描述】:

我正在使用 Restkit API 来解析从我的网络服务器收到的 JSON 回复。来自网络服务器的回复是这种形式.scre

JSON 回复是这样的

"Menu Items":[
            
                "ID":393,
                "Title":"Lentil Soup",
                "Description":"This is extremely tasty",
                "Image":"Lentil_1.png"
            ,
               
                "ID":392,
                "Title":"Chicken Tortilla Soup",
                "Description":"Quick. Simple. Delicious.":"$20",
                "Image":"Tortilla_3.png"
            
        ]

我正在使用下面的代码来获取响应,但没有得到任何响应。

NSURL *baseURL = [NSURL URLWithString:@"http://URL.com"];

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; // init by url
[client setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/html"];

//set up restkit
RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];
//setup object mapping
//addAttributeMappingsFromArray is a shortcut method to use when the JSON and your data model share the same keys, which is “name” in your case.

RKObjectMapping* boyMapping = [RKObjectMapping mappingForClass:[ListItem class] ];
[boyMapping addAttributeMappingsFromArray:@[@"ID"]];

// register mappings with the provider using a response descriptor
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:boyMapping
                                             method:RKRequestMethodAny
                                        pathPattern:@"/demo/restaurant/app/menu_lists.php"
                                            keyPath:@"Menu Items"
                                        statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addResponseDescriptor:responseDescriptor];
    NSDictionary *parameterDict = [NSDictionary dictionaryWithObjectsAndKeys:_slugString, @"item_slug", nil];
[[RKObjectManager sharedManager] getObjectsAtPath:@"/demo/restaurant/app/menu_lists.php"
                                       parameters:parameterDict
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                                              _menuItems = mappingResult.array;
                                              NSLog(@"menuItems is %@", _menuItems);
                                          
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                              NSLog(@"What do you mean by 'there is no coffee?': %@", error);
                                          ];

每次都进入失败区块。

【问题讨论】:

调试日志中的错误是什么? 这是错误日志,我得到“在搜索的关键路径中找不到可映射的对象表示。” 粘贴收到的实际 JSON。打开跟踪日志记录。 @Wain 我已经粘贴了 JSON 回复 在您显示的内容中看不到问题,因此您需要包含更多的日志输出 【参考方案1】:

(假设收到的响应的状态码为 200)

你创建一个对象管理器:

RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];

然后你配置它。但是,然后您尝试将其用于:

[[RKObjectManager sharedManager] getObjectsAtPath:...

这是使用在代码中其他地方创建的不同实例,并且没有您在 objectManager 上设置的任何配置。

您需要重新组织代码以确保创建并正确使用对象管理器。

【讨论】:

以上是关于解析 NSArray 的 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

根据 NSDictionary 键值将 NSArray 拆分为子数组

NSDictionary 的 NSArray 过滤和 NSDictionary

NSArray 和 NSDictionary

NSArray 中的 NSDictionary

来自 plist 文件的 NSArray 或 NSDictionary

带有 NSArray 的 UITableview 包含 NSDictionary 和 NSDictionary 包含另一个 NSDictionary