如何在Swift上使用RESTKIT处理来自JSON的Null映射

时间:2015-01-20 14:02:11

标签: ios json restkit

当我的服务器收到包含空值的答案时(在JSON响应中),RestKit内部映射在处理null值时崩溃。

有没有办法克服这个问题?

我试过扩展NSNull以包含"缺失"方法,但这不起作用,似乎是错误的。

以下是我的映射和目标代码以及restkit输出:

对象映射:

var tempmapping = RKObjectMapping(forClass: PRLAUser.classForCoder())
        tempmapping.addAttributeMappingsFromDictionary([
            "firstName" : "firstName",
            "secondName" : "lastName",
            "email" : "email",
            "id" : "prlaToken"

            ])

目标代码 - 至少是要映射的变量:

var email : String?
var firstName : String?
var lastName : String?


var prlaToken : String?

崩溃日志:

Parola[6138:3119821] -[NSNull length]: unrecognized selector sent to instance 0x197b86ba0

2015-01-20 15:53:37.973 Parola [6138:3119821] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [NSNull length]:无法识别的选择器发送到实例0x197b86ba0' * 第一次抛出调用堆栈: (0x1867fa59c 0x196f040e4 0x186801664 0x1867fe418 0x186702b6c 0x100707964 0x100023dc8 0x187605b10 0x1000a34a0 0x1000a4078 0x1000a99d4 0x1000a8dfc 0x10009a8f4 0x1000995a8 0x10009bbb4 0x10009c294 0x10009ca84 0x1875f461c 0x1000e4754 0x1000e2acc 0x1875f461c 0x1876b626c 0x1007b4df0 0x1007bf854 0x1007b8120 0x1007c175c 0x1007c2f18 0x1977252e4 0x197724fa8) libc ++ abi.dylib:以NSException类型的未捕获异常终止

非常感谢有关此事的任何协助。

2 个答案:

答案 0 :(得分:2)

版本0.23.1适用于您。 我在RestKit github页面上发布了临时修复问题。

https://github.com/RestKit/RestKit/issues/2155

在一个将NSNull变为String的对象中,我做了类似这样的事情

public override func validateValue(ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKeyPath inKeyPath: String, error outError: NSErrorPointer) -> Bool {
    if let memory = ioValue.memory {
        if inKeyPath == "hint" && ioValue.memory is NSNull {
            ioValue.memory = nil
            return true
        }
    }
    return super.validateValue(ioValue, forKeyPath: inKeyPath, error: outError)
}

您还可以在要求

时更改RKMappingOperationDataSource以在代表NO中返回

- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation;

顺便说一句。这个问题已经存在于Stack:RestKit JSON null value crash

答案 1 :(得分:0)

如果服务器向您发送空值,您首先必须确定它的真正含义。例如,如果您希望字典中有字符串,那么该键可能不存在,值可能为null,值可能是空字符串,您需要决定是否要将这些情况视为相同或不相同。设计JSON数据的人实际上可能希望您以不同方式处理空值。

之后,直接的事情是通过比较if(object ==(id)[NSNull null])或者通过向NSDictionary添加一个类别来检查空​​值,NSDictionary为你做检查并返回你想要的任何值。