在使用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的元素。我不认为这与我在解决如何拆分单店词典时想要实现的目标有关。
答案 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 objectForKey和Key-Value Coding Programming Guide。