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

时间:2012-09-13 22:17:40

标签: objective-c ios json null restkit

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

当我进行getAllEvents API调用时,如果用户没有任何事件,API将在有效负载中返回空值,例如{"events":null}。 null值会导致调用RestKit request: didFailLoadWithErrorobjectLoader: didFailWithError方法,我不一定要这样做,因为这是有0个事件的预期行为。它提供的错误消息是Could not find an object mapping for keyPath: ''

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

2 个答案:

答案 0 :(得分:2)

  

当列表为空时,JSON应该返回什么标准?

我不知道真的,但我会选择一个空阵列:

{ 'events' : [] }

如果某个值为null,我根本不会发送它[节省带宽]。

编辑:see this answer too

答案 1 :(得分:1)

更新:这不再适用于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];

}