首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AFNetworking [NSNull长度]

AFNetworking [NSNull长度]
EN

Stack Overflow用户
提问于 2014-04-04 23:29:50
回答 3查看 563关注 0票数 0

我的应用程序崩溃了,错误如下:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x1cb8068'

我有很多数据需要在我的表中显示。

在这个例子中,我在我的JSON中使用了键,品牌。

如果我NSLog这些品牌,我会得到类似这样的结果:

品牌A

品牌B

C品牌

E品牌

品牌Z

当我滚动我的表格时,我点击了一个,应用程序崩溃了。

如何将替换为字符串?

下面是我的方法:

代码语言:javascript
复制
- (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

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface NSDictionary (Utility)

- (NSString*)stringForKey:(id)key;

@end

.m

代码语言:javascript
复制
#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添加到我的主类中?

EN

回答 3

Stack Overflow用户

发布于 2014-04-04 23:35:22

您确定JSON没有返回具有"null“值的元素吗?

票数 0
EN

Stack Overflow用户

发布于 2014-04-04 23:56:56

如果您查看服务器提供给您的实际JSON文档,您会发现它包含"null“值。当数据中存在" null“值时,NSNull解析器将生成值JSON null来表示null。

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

处理此问题的最简单方法是:使用如下方法向NSDictionary添加一个类别

  • (NSString*)stringForKey;
  • (NSNumber*)numberForKey;

它调用objectForKey,检查对象的类型,如果类型错误,则返回nil。

举个例子:

代码语言:javascript
复制
@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",你可以这样写

代码语言:javascript
复制
NSString* myString = [myDict stringForKey:@"MyString"];

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

票数 0
EN

Stack Overflow用户

发布于 2014-09-03 05:30:29

我使用

代码语言:javascript
复制
- (id)objectForKeyNotNull:(id)key
{
    id object = [self objectForKey:key];
    if (object == [NSNull null])
        return nil;

    return object;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22866951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档