【问题标题】:RestKit : how to map an array with correct type?RestKit:如何映射具有正确类型的数组?
【发布时间】:2014-01-20 02:26:07
【问题描述】:

得到:

@property(nonatomic, retain) NSString *user;
@property(nonatomic, retain) NSString *token;
@property(nonatomic, retain) NSArray *list;// NSNumber only please!

还有:

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[MyResponse class]];
[mapping addAttributeMappingsFromDictionary:@{
    @"user" : @"user",
    @"token" : @"token",
    @"list" : @"list",
 }];

我收到 Json:

{"user":"foobar","token":"azerty","list":[0,1,"2"]}

不幸的是,list 将是 NSString 和 NSNumber 的混合体。如何告诉 RestKit 0.2x 我只想要 NSArray 中的 NSNumber 或 NSString?

【问题讨论】:

    标签: ios objective-c mapping restkit-0.20


    【解决方案1】:

    RestKit 使用 KVC,所以如果你只想要数字,你可以使用适当的 keyPath,例如如果我希望数字始终是整数,我可以使用 integerValue 方法,NSNumberNSString 都有:

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[MyResponse class]];
    [mapping addAttributeMappingsFromDictionary:@{
      @"user"              : @"user",
      @"token"             : @"token",
      @"list.integerValue" : @"list",
    }];
    

    【讨论】:

    • 酷。我没有意识到这一点。谢谢。
    • 当它是 NSArray 或 NSDictionary 时引发异常。完全不安全。
    • @cœur 如果您的数据非常不规则,那么您将无法使用像RestKit这样的框架来获得乐趣
    【解决方案2】:

    与其重写 JSON 解析器来完成您的特定任务,为什么不只是对“列表”进行后处理并使用 if([list[i] isKindOfClass:[NSString class]]) 检查每个对象并将其转换为 NSNumber?

    【讨论】:

    • 烦人,我不知道RestKit对于基本的映射如此无用。所以,MyResponse 对象到处都是 RKObjectRequestOperation 的结果,我不得不:response.list = [response.list filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSNumber self]]];
    猜你喜欢
    • 2013-05-26
    • 2017-03-11
    • 2014-08-13
    • 2021-12-11
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多