我有一个简单的NSDictionary
,我试图通过返回的JSON来填充来自外部网站的数据。返回的JSON很好但我在获取特定密钥的实际数据时遇到了麻烦。
以下是打印到控制台的JSON数据。
这是我的JSON数据:
(
{
CategoryID = 12345;
CategoryName = "Baked Goods";
},
{
CategoryID = 12346;
CategoryName = Beverages;
},
{
CategoryID = 12347;
CategoryName = "Dried Goods";
},
{
CategoryID = 12348;
CategoryName = "Frozen Fruit & Vegetables";
},
{
CategoryID = 12349;
CategoryName = Fruit;
},
{
CategoryID = 12340;
CategoryName = "Purees & Soups";
},
{
CategoryID = 12341;
CategoryName = Salad;
},
{
CategoryID = 12342;
CategoryName = "Snack Items";
},
{
CategoryID = 12343;
CategoryName = Vegetables;
}
)
我得到的错误是:
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [__ NSCFArray enumerateKeysAndObjectsUsingBlock:]:发送到的无法识别的选择器 实例0x6884000'
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSError *error = nil;
// Get the JSON data from the website
NSDictionary *categories = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (categories.count > 0){
NSLog(@"This is my JSON data %@", categories);
[categories enumerateKeysAndObjectsUsingBlock: ^(__strong id key, __strong id obj, BOOL *stop) {
NSLog(@"Key = %@, Object For Key = %@", key, obj); }];
}
我不确定为什么会这样,但我确定这很简单,就像我使用的是不正确的物品一样。
非常感谢帮助。
答案 0 :(得分:4)
+JSONObjectWithData:options:error:
返回NSArray而不是NSDictionary。 '-[__NSCFArray enumerateKeysAndObjectsUsingBlock:]
是错误消息的关键部分。它告诉您在阵列上调用-enumerateKeysAndObjectsUsingBlock:
。
对于这种情况,您可以使用-enumerateObjectsUsingBlock:
代替。
如果您不确定是否会返回NSArray或NSDictionary,您可以使用-isKindOf:
id result = [NSJSONSerialization …];
if ([result isKindOf:[NSArray class]]) {
NSArray *categories = result;
// Process the array
} else if ([result isKindOf:[NSDictionary class]]) {
NSDictionary *categories = result;
// Process the dictionary
}
使用数组中的每个对象执行给定的块,从第一个对象开始,然后通过数组继续到最后一个对象。
- (void)enumerateObjectsUsingBlock:(void(^)(id obj,NSUInteger idx,BOOL * stop))block
所以应该这样称呼
[categories enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"index = %d, Object For Key = %@", idx, obj);
}];
快速阅读文档确实可以为您节省很多挫折。