防止空 JSON 响应被映射 RestKit 0.22.0

Posted

技术标签:

【中文标题】防止空 JSON 响应被映射 RestKit 0.22.0【英文标题】:Preventing null JSON responses from being mapped RestKit 0.22.0 【发布时间】:2014-05-18 03:40:44 【问题描述】:

我在将空 JSON 值映射到 Core Data 中的对象时遇到问题,这会导致错误。来自我的服务器的 GET 响应示例如下:


    "status": "Success",
    "result": 
        "users": [
            
                "id": 240,
                "username": "user",
                "fullName": "My Name",
                "profilePicture": 
                    "id": 12,
                    "ownerID": "240", 
                    "imageURL": "/photos/240/12",
                
            ,
            
                "id": 241,
                "username": "username",
                "fullName": "Full Name",
                "profilePicture": NULL
            
        ]
    

我已设置 RestKit 0.22.0 以将“profilePicture”的 JSON 值映射为 User 实体的关系(实体类型为 Photo)。 profilePicture 关系对于 User 实体是可选的。当数据库返回 NULL 值(也就是用户没有设置个人资料图片)时,就会出现问题。 RestKit 将创建一个所有属性都等于 nil 的新 Photo 实体,并将其设置为 User 实体的 profilePicture 关系。这给我带来了很多问题。如何防止 NULL 值被映射?

我尝试设置userMapping.assignsNilForMissingRelationships = YES,但这似乎不起作用。

编辑:我应该指出,当用户设置他们的个人资料图片时,一切都很好。只有当返回的 profilePicture 值为 NULL 时,我才会遇到问题。

更新:即使在更改 API 以在 NULL 时完全省略“profilePicture”键/值对后,RestKit 仍将 User 实体的 profilePicture 关系分配给 Photo 实体所有nil 属性。

【问题讨论】:

FWIW,现在 if(dict[@"profilePicture"]) 会给你你想要的结果,对吧? @JoeBlow 是的,除了映射由 RestKit 自动处理。 很公平。我有点在“RestKit 现在是多余的”阵营中,伙计! 我同意。如果这个项目的截止日期不是那么快,我会完全删除 RestKit 并使用 AFNetworking 自己处理所有映射。 RestKit 似乎变得太“聪明”了。 【参考方案1】:

即使在更改 API 以在 NULL 时完全省略“profilePicture”键/值对后,RestKit 仍然将 User 实体的 profilePicture 关系分配给具有所有 nil 属性的 Photo 实体。

这应该是不可能的。如果密钥不在 JSON 中,RestKit 将不会做任何工作或填充关系。

在任何情况下,您都希望使用 KVC 验证来验证任何新创建的照片实体并在对象无效时中止处理。见discardsInvalidObjectsOnInsert

【讨论】:

即使在设置photoMapping.discardsInvalidObjectsOnInsert = YES; 之后,当响应包含空值/省略值时,我仍然会得到NSValidationErrorKey=photoID, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1570.)。我更新了示例 JSON 响应以显示更准确的响应。

以上是关于防止空 JSON 响应被映射 RestKit 0.22.0的主要内容,如果未能解决你的问题,请参考以下文章

restkit 映射嵌套数组为空(带有 json 响应的嵌套 restkit 请求)

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

RestKit 0.20:映射复杂的动态嵌套 JSON

使用 RESTKit 映射带有括号的 JSON 响应

在 RestKit 映射它之前访问 JSON 响应

来自 JSON 的 RestKit 对象映射