我有来自JSON响应的数组。
NSLog(@"%@", arrayFromString)
提供以下内容:
{ meta = { 代码= 200; }; response = { 组=( { items =( { 类别=( { icon = “http://foursquare.com/img/categories/parks_outdoors/default.png”; id = 4bf58dd8d48988d163941735;
依旧......
此代码
NSArray *arr = [NSArray arrayWithObject:[arrayFromString valueForKeyPath:@"response.groups.items"]];
给数组提供了一个我无法迭代的元素。但是,如果我使用NSLog写出来,我可以看到它的所有元素。
最后,我希望有一个项目数组,我可以迭代为我的iPhone应用程序构建表视图的数据源。
我将如何做到这一点?
编辑:
我通过从嵌套数组中获取值来解决了我的问题(objectAtIndex:0):
for(NSDictionary *ar in [[arrayFromString valueForKeyPath:@"response.groups.items"] objectAtIndex:0]) {
NSLog(@"Array: %@", [ar objectForKey:@"name"]);
}
答案 0 :(得分:1)
查看您发布的JSON字符串,response.groups.items看起来是一个包含一个项目的数组,一个包含一个键的地图/字典“categories”。将其记录到字符串将遍历整个树,但要以编程方式访问它,您必须自己走树。如果没有看到更完整的JSON示例,很难确切地知道正确的做法是在这里做什么。
编辑:
遍历这样的对象图并不那么简单;有多种不同的方法(深度优先,广度优先等),所以它不一定是一个简单的API供您使用。我不确定这是否与您正在使用的JSON库相同,但是,例如,来自JSON库的this is the code,它执行生成您正在看到的字符串的工作。正如你所看到的,它有点涉及 - 当然不是单行或任何东西。
你可以尝试这个,我在没有测试或保修的情况下出现:
void __Traverse(id object, NSUInteger depth)
{
NSMutableString* indent = [NSMutableString string];
for (NSUInteger i = 0; i < depth; i++) [indent appendString: @"\t"];
id nextObject = nil;
if ([object isKindOfClass: [NSDictionary class]])
{
NSLog(@"%@Dictionary {", indent);
NSEnumerator* keys = [(NSDictionary*)object keyEnumerator];
while (nextObject = [keys nextObject])
{
NSLog(@"%@\tKey: %@ Value: ", indent, nextObject);
__Traverse([(NSDictionary*)object objectForKey: nextObject], depth+1);
}
NSLog(@"%@}", indent);
}
else if ([object isKindOfClass: [NSArray class]])
{
NSEnumerator* objects = [(NSArray*)object objectEnumerator];
NSLog(@"%@Array (", indent);
while (nextObject = [objects nextObject])
{
__Traverse(nextObject, depth+1);
}
NSLog(@"%@)", indent);
}
else
{
NSLog(@"%@%@",indent, object);
}
}
void Traverse(id object)
{
__Traverse(object, 0);
}
答案 1 :(得分:1)
首先,从JSON解析器返回的数据结构不是数组而是字典:{ key = value; ... }
(花括号)。
其次,如果要访问类似项的嵌套结构,则需要使用NSObject的valueForKeyPath:
方法。这将返回数据结构中所有项目的数组:
NSLog(@"items: %@", [arrayFromString valueForKeyPath:@"response.groups.items"]);
请注意,在检索此类项目对象时,您将忽略组的概念。