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

Ios 如何在Swift上使用RESTKIT处理来自JSON的空映射,ios,json,restkit,Ios,Json,Restkit,当从我的服务器接收到包含空值的应答(在JSON响应中)时,RestKit内部映射在处理空值时崩溃 有没有办法克服这个问题 我曾尝试扩展NSNull以包含“缺少的”方法,但这不起作用,而且似乎是错误的 以下是我的映射和目标代码以及restkit输出: 对象映射: var tempmapping = RKObjectMapping(forClass: PRLAUser.classForCoder()) tempmapping.addAttributeMappingsFromDicti

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

有没有办法克服这个问题

我曾尝试扩展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 0x1875F462C 0x1007B4F0 0x1007BF8254 0x1007b8120 0x1007C1777F19FA8) libc++abi.dylib:以NSException类型的未捕获异常终止


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


在这之后,简单的方法是通过比较if(object==(id)[NSNull null])来检查空值,或者向NSDictionary添加一个类别,该类别为您进行检查并返回您想要的任何值

0.23.1版适合您。 我在RestKitGithub页面上发布了这个问题,并进行了临时修复

在一个将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)
}

public override func validateValue(ioValue:AutoreleasingUnsafeMutablePointer

见我之前的文章。这篇文章建议扩展NSNull以避免这些调用。这些调用不是问题。问题是为什么要调用它们。想想JSON是什么-在某种程度上类似于Swift。你可以拥有一个键为“foo”的字典,值为“bar”,或者该值可以为nil。nil是完全合法的,JSON到本机的转换将插入一个[NSNull null]作为占位符。处理转换后的JSON的一种方法是测试每个值,每个字符串、数字、数组或字典中的[NSNull null]-然后处理它。我试过了,它变得越来越复杂。另一个解决方案是,当收到普通消息时,以某种方式从NSNull返回一些正常的东西-因此我上面的解决方案。看,这似乎是restkit中的一个新错误。但我自己并没有处理解析,restkit是。问题是restkit是trying将字符串变量设置为nsnull。不能将swift对象关联为nsnull,更不能将其关联为可选的swift值。因此objectove c代码稍后假定swift变量为字符串,并尝试将其发送消息,即长度。最后,它是RestKit中的一个错误,现在可能已修复。我在该RestKit中添加了1行代码ion试图对付这个bug,但由于我不能抓住机会选择一个没有完全更新的第三方库来处理swift选项,我最终没有使用RestKit。我不会说来自RestKit的bug,我检查了源代码,发现了导致这个“bug”的提交和更改然而,他们只是依靠内部的苹果api来检查属性的有效性(所以这是
validateValue
)。如果你在Objc中运行这段代码,它会说NSNull与NSString不对应,但在Swift中它会说它……这就是为什么这段使用
validateValue
的“黑客”行为:/