AFNetworking [NSNull length]

时间:2014-04-04 15:29:50

标签: objective-c json uitableview afnetworking

我的应用中出现此错误:

*** 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添加到我的主类?

3 个答案:

答案 0 :(得分:0)

你确定JSON没有返回带有&#34; null&#34;的元素。值?

答案 1 :(得分:0)

如果你查看服务器给你的实际JSON文档,你会发现它包含&#34; null&#34;值。当有一个&#34; null&#34;在数据中的值,JSON解析器将生成值[NSNull null]来表示null。

您必须检查该值。如果你认为你有一个NSString,一个NSNumber,一个NSArray或一个NSDictionary,但你真正拥有的是[NSNull null],并且你发送一条消息,你将会崩溃。

处理此问题的最简单方法:使用

等方法向NSDictionary添加类别
  • (的NSString *)stringForKey;
  • (的NSNumber *)numberForKey;

调用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 *。 (有些服务器倾向于发送仅由数字组成的字符串作为数字而不是字符串)。因此,如果你想要键#34; MyString&#34;的字符串,你可以写

NSString* myString = [myDict stringForKey:@"MyString"];

你可以确定结果是nil或字符串。

答案 2 :(得分:0)

我用

- (id)objectForKeyNotNull:(id)key
{
    id object = [self objectForKey:key];
    if (object == [NSNull null])
        return nil;

    return object;
}

将NSNull值转换为nil。我将此作为一个类别添加到NSDictionary。