- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[jsonArray removeAllObjects];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
responseData = nil;
NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue] objectForKey:@"DataTable"];
NSMutableArray * myArray = [[NSMutableArray alloc] init];
NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
if (([(NSString*)sdf isEqual: [NSNull null]])) {
// Showing AlertView Here
}else {
for (int i=0; i<[sdf count]; i++) {
myDict=[sdf objectAtIndex:i];
[myArray addObject:[myDict objectForKey:@"RxnCustomerProfile"]];
}
jsonArray=[myArray mutableCopy];
NSMutableDictionary *dict=[jsonArray objectAtIndex:0];
if ([dict count]>1) {
// Showing AlertView Here
}
}
}
大家好,我对-[__NSArrayM objectForKey:]:
有疑问。
试图解决但没有得到更好的解决方案。请帮帮我
找到解决方案。在此先感谢
以下是问题
由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSArrayM objectForKey:]:无法识别的选择器发送到实例0x19731d40'
答案 0 :(得分:3)
这是一个调试问题,没有人可以真正解决它,因为你使用的是定义和值未知的非局部变量,没有提到你正在使用SBJSON
(我猜)等等但是,让我们看看我们是否可以给你一些指示。你的错误:
[__NSArrayM objectForKey:]: unrecognized selector sent to instance
这告诉您已将字典方法(objectForKey
)发送到数组(__NSArrayM
)。所以,当你认为自己有一本字典时,你就会有一个数组。
现在您声明并分配字典:
NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
然后分配给它:
myDict=[sdf objectAtIndex:i];
因此,这会丢弃您分配的字典,而是分配数组i
中索引为sdf
的任何内容。你如何知道而不是思考,那么数组元素是一个字典?你不测试检查......
那么sdf
来自哪里?这一行:
NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue] objectForKey:@"DataTable"];
所以在某个未知字符串上调用JSONValue
,假设结果是字典(可能是数组吗?还是失败?),查找键(做错了)来自这一行?),假定结果是一个数组。
所以你需要做的就是去测试所有这些假设,在某个地方你会找到一个你认为有字典的数组。
快乐狩猎!
答案 1 :(得分:1)
你在阵列格式中发现了值,并且你在字典中集成了方法。
答案 2 :(得分:0)
您不需要迭代键,dict的值可以直接将值传递给其他部分内的数组,如:
myArray = [sdf objectForKey:@"RxnCustomerProfile"];
键RxnCustomerProfile
本身包含数组而不是字典。
在代码下方更改您的if else部分:
if (([(NSString*)sdf isEqual: [NSNull null]])) {
// Showing AlertView Here
}else {
myArray = [sdf objectForKey:@"RxnCustomerProfile"];
}
答案 3 :(得分:0)
NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue] objectForKey:@"DataTable"];
检查Sdf
if([sdf isKindOfClass:[NSDictionary class]])
{
NSLog(@"Dictionary");
}
else if([sdf isKindOfClass:[NSArray class]])
{
NSLog(@"NSArray");
}
else if([sdf isKindOfClass:[NSMutableArray class]])
{
NSLog(@"NSMutableArray");
}
答案 4 :(得分:0)
首先,好像你的json实际上没有正确格式化。在不知道responseData看起来是什么样的情况下,很难确切地说出什么是错误的。但在您的代码中,有一些领域可以改进。
首先,您不需要使用[responseString JSONValue]
。您可以使用
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
NSArray *sdf = responseDictionary[@"DataTable"];
现在,其余的全部取决于responseData
中的数据。
但是你可以让你的代码更清洁(如果我理解你正在努力实现的目标:
NSMutableArray *myArray = [NSMutableArray array];
if ([sdf isEqual:[NSNull null]]) {
// Showing AlertView here
} else {
for (NSDictionary *myDict in sdf) {
[myArray addObject:dict[@"RxnCustomerProfile"]];
}
}
// No idea what you're trying to achieve here, but here goes:
jsonArray = [myArray mutableCopy];
NSDictionary *dict = jsonArray.first;
if (dict.count > 1) {
// Showing AlertView here
}
有些事情需要注意。你没有明显的理由非常自由地使用NSMutableArray
和NSMutableDictionary
。如果您实际更改数组或字典,请仅使用mutable。