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

How to deal with Null mapping from JSON using RESTKIT on Swift

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

有什么办法可以克服这个问题吗?

我尝试扩展 NSNull 以包含 "missing" 方法,但这没有用,而且似乎是错误的。

以下是我的映射和目标代码以及 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 长度]:无法识别的选择器发送到实例 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

类型的未捕获异常终止

非常感谢对此事的任何帮助。

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

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

版本 0.23.1 适合您。 我在 RestKit github 页面上发布了问题并进行了临时修复。

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

在将 NSNull 转换为字符串的对象中,我做了类似这样的事情

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)
}

你也可以在请求

时将delegate NO中的RKMappingOperationDataSource改为return

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

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