Reskit - 映射到数组

Posted

技术标签:

【中文标题】Reskit - 映射到数组【英文标题】:Reskit - Mapping to array 【发布时间】:2013-01-11 09:58:10 【问题描述】:

我正在尝试运行一些单元测试来测试我使用 RestKit v0.20 的映射,但是我收到一个错误,即我的目标对象为 nil。我已经追踪到映射失败的事实,因为 sourceType 是 NSArray 而我的 destinationType 是 NSNumber。我认为这是因为我的映射键路径不正确。我正在尝试将 songCard JSON 映射到我的对象。我在下面包含了我的 JSON 和映射测试。 如果有人可以帮助我设置正确的密钥路径,那就太好了。

"status" : 2000,
  "content" : 
    "cardList" : [
      
        "songCard" : 
          "likes" : 2,
          "dislikes" : 3
        
      
    ]
  ,
  "message" : "OK"

单元测试类

- (RKObjectMapping *)songMetadataMapping

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[SongMetadata class]];
    [mapping addAttributeMappingsFromDictionary:@
     @"content.cardList.songCard.likes":    @"likes"
     ];

    return mapping;


- (void)testSongMetadataMapping

    NSString *parsedJSON = [RKTestFixture parsedObjectWithContentsOfFixture:@"songMetadata.json"];
    RKMappingTest *test = [RKMappingTest testForMapping:[self songMetadataMapping] sourceObject:parsedJSON destinationObject:nil];
    [test addExpectation:[RKPropertyMappingTestExpectation expectationWithSourceKeyPath:@"content.cardList.songCard.likes" destinationKeyPath:@"likes" value:@"2"]];

    STAssertTrue([test evaluate], @"Mappings failed");


更新 经过进一步调试,我发现我的 JSON 字符串中的值 2 被评估为 NSArray,而这应该被评估为 NSNumber。作为一项快速测试,我删除了 JSON 中的 [ ],并且值 2 被正确评估为 NSNumber。这并不能解决我的问题,因为我需要将我的 JSON 标识为一组 songCard 对象

【问题讨论】:

【参考方案1】:

正如您所注意到的,当数组在运行时,您不能使用您指定的键路径。我可以想到两个选项 - 第一个是远射,但关键路径 content.cardList[0].songCard.likes 有效吗?

否则,考虑使用方法:

+ (instancetype)expectationWithSourceKeyPath:(NSString *)sourceKeyPath 
destinationKeyPath:(NSString *)destinationKeyPath 
evaluationBlock:(RKMappingTestExpectationEvaluationBlock)evaluationBlock;

使用 keypath content.cardList 并提供一个评估块 1) 检查映射是否为包含单个对象的数组。然后,您可以检查该对象是否包含 songCard 对象,并且该对象的 likes 值为 2。

【讨论】:

以上是关于Reskit - 映射到数组的主要内容,如果未能解决你的问题,请参考以下文章

nsnumbers 数组的 Reskit POST 生成字符串 JSON 字段

ResKit:临时 NSManagedObjects

RESKit:无响应描述符

RESKit:创建了重复的对象

ResKit iOS - 为同一个元素注册多个类

将数组映射到新数组