RestKit 从 JSON 响应返回空值作为“<null>”

Posted

技术标签:

【中文标题】RestKit 从 JSON 响应返回空值作为“<null>”【英文标题】:RestKit returns null value as "<null>" from JSON response 【发布时间】:2013-01-04 02:32:38 【问题描述】:

我从 restkit 获得的 JSON 响应中有一个奇怪的错误。

我向服务器发出一个 post 请求,它以 "someVal" = "&lt;null&gt;" 而不是 "someVal" = null 响应。这导致 xcode 以一种非常奇怪的方式处理它,因此我似乎无法将其保存到 NSUserDefaults ......而且我不能像正常的空值一样删除它......它会被检测为什么?我想也许是一个字符串?但是不……由于某种原因,它不能将其保存为字符串。

【问题讨论】:

您确定该值存储为字符串"&lt;null&gt;"?因为打印带有[NSNull null] 值的字典的描述也会产生输出key = "&lt;null&gt;" 【参考方案1】:

我不认为这个问题仅限于 RestKit。更多来自为您提供 JSON 的服务器。我在使用 AFNetworking 时遇到了同样的问题。

我找到了这个字典类别,您可以使用它来删除空值并替换为空字符串。您可以使用它,也可以直接删除逻辑来对您的空值进行排序。

@implementation NSDictionary (JRAdditions)

- (NSDictionary *) dictionaryByReplacingNullsWithStrings 

    NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:self];
    const id nul = [NSNull null];
    const NSString *blank = @"";

    for(NSString *key in self) 
        const id object = [self objectForKey:key];
        if(object == nul) 
            //pointer comparison is way faster than -isKindOfClass:
            //since [NSNull null] is a singleton, they'll all point to the same
            //location in memory.
            [replaced setObject:blank forKey:key];
        
    
    return [NSDictionary dictionaryWithDictionary:replaced];


+ (NSDictionary *)dictionaryByReplacingNullsWithStrings:(NSDictionary *)dict 
    NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:dict];
    const id nul = [NSNull null];
    const NSString *blank = @"";

    for(NSString *key in dict) 
        const id object = [dict objectForKey:key];
        if(object == nul) 
            //pointer comparison is way faster than -isKindOfClass:
            //since [NSNull null] is a singleton, they'll all point to the same
            //location in memory.
            [replaced setObject:blank forKey:key];
        
    
    return [NSDictionary dictionaryWithDictionary:replaced];


@end

// you can use this category on your dictionaries.
NSDictionary *jsonDict = JSON;
jsondict = [jsonDict dictionaryByReplacingNullsWithStrings];

【讨论】:

这不适用于显示为“”的值,而不是 null 对我来说。我使用此方法删除标准空值,但它不会删除当我 NSLog 数据馈送时显示为“”的值。 它可能是具有该值的字符串。也许修改该方法以将字符串 替换为空字符串。 它不将“”识别为字符串类型,虽然这很奇怪。 这很奇怪。那么你可能更接近我原来的答案。您可能需要调试该方法以查看您的 null 是什么类型。也许在你做对之前修补它。

以上是关于RestKit 从 JSON 响应返回空值作为“<null>”的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 从 Foursquare API 返回 nil 响应

RestKit - 删除没有返回的对象

Restkit 0.20 对象在获取 json 响应后未映射

RestKit 没有从 JSON 映射图像

JSON 对象映射 - RestKit

Vue.JS 从 JSON 对象打印空值