当涉及到在使用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,并为公司节点(?)填充正确的信息。
但是,当涉及到relations和存储节点时,我的问题就出现了。
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的元素。这,我不认为,是相关的,当我试图实现当涉及到如何分裂单一商店字典。
发布于 2011-10-28 03:50:18
首先,请注意,顶级元素是数组,而不是对象.因此:
NSDictionary *object = [parser objectWithString:[response asString] error:nil];应:
NSArray *object = [parser objectWithString:[response asString] error:nil];我会使用companies而不是object作为变量名。
其次,在使用-valueForKey:时必须小心。发送到数组时,它返回--另一个数组,其中包含与键参数对应的值。除非您熟悉键值编码,否则使用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 objectForKey和键值编码编程指南,然后再使用-valueForKey:。
https://stackoverflow.com/questions/7924769
复制相似问题