我的应用程序崩溃了,错误如下:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x1cb8068'我有很多数据需要在我的表中显示。
在这个例子中,我在我的JSON中使用了键,品牌。
如果我NSLog这些品牌,我会得到类似这样的结果:
品牌A
品牌B
C品牌
空
E品牌
空
空
品牌Z
当我滚动我的表格时,我点击了一个,应用程序崩溃了。
如何将替换为字符串?
下面是我的方法:
- (void)updateData
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://mydataurl.com/abc" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray * aArray = [responseObject valueForKeyPath:@"result_payload.items"];
self.inventoryArray = [NSArray arrayWithArray:aArray];
// ***** Brand ******
self.brandArray = [self.inventoryArray valueForKeyPath:@"brand"];
for (int a = 0; a < [self.brandArray count]; a++)
{
self.brandString = [self.brandArray objectAtIndex:a];
}
[self.tableView reloadData];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];我已经为NSDictionary添加了一个类别:
.h
#import <Foundation/Foundation.h>
@interface NSDictionary (Utility)
- (NSString*)stringForKey:(id)key;
@end.m
#import "NSDictionary+Utility.h"
@implementation NSDictionary (Utility)
- (NSString*)stringForKey:(id)key
{
NSString * string = [self objectForKey:key];
if ([string isEqual:[NSNull null]])
{
return nil;
}
return string;
}
@end我不经常使用类别,我需要在特定的地方调用这个方法吗?或者只是将#import添加到我的主类中?
发布于 2014-04-04 23:35:22
您确定JSON没有返回具有"null“值的元素吗?
发布于 2014-04-04 23:56:56
如果您查看服务器提供给您的实际JSON文档,您会发现它包含"null“值。当数据中存在" null“值时,NSNull解析器将生成值JSON null来表示null。
您必须检查该值。如果你认为你有一个NSString,或者一个NSNumber,或者一个NSArray或者一个NSDictionary,但是你真正拥有的是一个NSNull null,并且你给它发送了一条消息,你将会得到一个崩溃。
处理此问题的最简单方法是:使用如下方法向NSDictionary添加一个类别
它调用objectForKey,检查对象的类型,如果类型错误,则返回nil。
举个例子:
@interface NSDictionary (JSONExtensions)
- (NSString*)stringForKey:(NSString*)key;
@end
@implementation NSDictionary (JSONExtensions)
- (NSString*)stringForKey:(NSString *)key
{
id result = [self objectForKey:key];
if ([result isKindOfClass:[NSNumber class]])
result = [((NSNumber *) result) stringValue];
else if (! [result isKindOfClass:[NSString class]])
result = nil;
return result;
}
@end如果键不存在,或者值为NSNull null,或者值是数组或字典,则返回nil。它会将一个数字转换成一个字符串并返回一个字符串,所以你可以保证得到nil或NSString*。(一些服务器倾向于将只包含数字的字符串作为数字发送,而不是字符串)。所以如果你想要一个字符串作为键"MyString",你可以这样写
NSString* myString = [myDict stringForKey:@"MyString"];你可以确定结果是nil或者一个字符串。
发布于 2014-09-03 05:30:29
我使用
- (id)objectForKeyNotNull:(id)key
{
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
}将NSNull值转换为nil。我将其作为一个类别添加到NSDictionary上。
https://stackoverflow.com/questions/22866951
复制相似问题