Objective c RestKit-使用空值/空数组映射JSON响应

Objective c RestKit-使用空值/空数组映射JSON响应,objective-c,ios,json,null,restkit,Objective C,Ios,Json,Null,Restkit,在RestKit获取期间,如何优雅地处理(预期的)nil密钥路径 当我在用户没有任何事件的情况下调用getAllEvents API时,API将在有效负载中返回空值,例如{“events”:null}。null值导致调用RestKitrequest:didFailLoadWithError和objectLoader:didFailWithError方法,我不一定希望调用这些方法,因为这是存在0个事件的预期行为。它给出的错误消息是找不到keyPath的对象映射:“” 我是否可以在映射配置和/或委托

在RestKit获取期间,如何优雅地处理(预期的)nil密钥路径

当我在用户没有任何事件的情况下调用getAllEvents API时,API将在有效负载中返回空值,例如
{“events”:null}
。null值导致调用RestKit
request:didFailLoadWithError
objectLoader:didFailWithError
方法,我不一定希望调用这些方法,因为这是存在0个事件的预期行为。它给出的错误消息是
找不到keyPath的对象映射:“”

我是否可以在映射配置和/或委托方法中处理此问题,或者我是否需要修改API,也许是为了返回空字符串而不是null。当列表为空时,JSON应该返回什么有一个标准吗

当列表为空时,JSON应该返回什么有一个标准吗

实际上我不知道,但我会选择一个空数组:

{ 'events' : [] }
如果一个值为空,我就根本不发送它[节省带宽]

编辑:

当列表为空时,JSON应该返回什么有一个标准吗

实际上我不知道,但我会选择一个空数组:

{ 'events' : [] }
如果一个值为空,我就根本不发送它[节省带宽]


编辑:。

更新:这不再适用于RestKit v0.10.x以外的版本。见@moonwave99的答案

找到了解决办法

最后我做了一些与moonwave的建议非常相似的事情,只是我现在将null对象更改为空数组

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id *)mappableData {

  id events = [*mappableData objectForKey:@"events"];

  if (events == [NSNull null]) {
    NSLog(@"it's null");
    [*mappableData setObject:@"" forKey:@"events"];
  }
}
为了成功处理现在为空的非空数组,我必须告诉事件映射忽略未知的密钥路径

[eventsMapping setIgnoreUnknownKeyPaths:YES];
现在,RestKit不像我一直期望的那样调用didFailWithError委托方法,而是调用didLoadObjects。在尝试分配给本机Cocoa对象之前,我可以从中检查数组是否为空

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {

  if ([objects count] == 0) {

    // No events, alert user

  }
  else if ([[objects objectAtIndex:0] isKindOfClass:[Events class]]) {

    Events *events = [objects objectAtIndex:0];

}

更新:这不再适用于RestKit v0.10.x以外的版本。见@moonwave99的答案

找到了解决办法

最后我做了一些与moonwave的建议非常相似的事情,只是我现在将null对象更改为空数组

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id *)mappableData {

  id events = [*mappableData objectForKey:@"events"];

  if (events == [NSNull null]) {
    NSLog(@"it's null");
    [*mappableData setObject:@"" forKey:@"events"];
  }
}
为了成功处理现在为空的非空数组,我必须告诉事件映射忽略未知的密钥路径

[eventsMapping setIgnoreUnknownKeyPaths:YES];
现在,RestKit不像我一直期望的那样调用didFailWithError委托方法,而是调用didLoadObjects。在尝试分配给本机Cocoa对象之前,我可以从中检查数组是否为空

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {

  if ([objects count] == 0) {

    // No events, alert user

  }
  else if ([[objects objectAtIndex:0] isKindOfClass:[Events class]]) {

    Events *events = [objects objectAtIndex:0];

}