解析 JSON - SBJsonParser 的问题
我目前在使用 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 并用 Company node(?) 的正确信息填充它。
但是当涉及到关系和存储节点时,我的问题就出现了。
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 的元素。我认为,这与我在解决如何拆分单个存储字典时想要实现的目标无关。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,请注意您的顶级元素是一个数组,而不是一个对象。因此:
应该是:
我会使用
companies
而不是object
作为变量名称。其次,使用
-valueForKey:
时必须小心。当发送到数组时,它返回另一个数组,其中包含与键参数对应的值。除非您熟悉键值编码,否则请使用 NSDictionary 中的规范方法返回与给定键关联的对象:-objectForKey:
。如果您使用
-objectForKey:
而不是-valueForKey:
,您在运行程序时就会注意到这个结构错误。记住这两点,您可以按如下方式浏览 JSON 数据:
我建议阅读 Stack Overflow 上的另一个问题:Difference valueforKey objectForKey< /a> 和 -valueForKey: 之前先阅读 rel="nofollow noreferrer">键值编码编程指南。
Firstly, note that your top-level element is an array, not an object. Hence:
should be:
and I’d use
companies
instead ofobject
as the variable name.Secondly, you must be careful when using
-valueForKey:
. When sent to an array, it returns another array containing the values corresponding to the key argument. Unless you are familiar with Key-Value Coding, use the canonical method inNSDictionary
to return the object associated to a given key:-objectForKey:
.Had you used
-objectForKey:
instead of-valueForKey:
, you would have noticed this structural error when running your program.With those two points in mind, you can navigate your JSON data as follows:
I recommend reading this other question on Stack Overflow: Difference valueforKey objectForKey and the Key-Value Coding Programming Guide before using
-valueForKey:
.