如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?

Posted

技术标签:

【中文标题】如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?【英文标题】:How to map a local JSON string into an object using RestKit 0.24 with RKObjectMapping? 【发布时间】:2015-11-21 14:59:52 【问题描述】:

我正在尝试使用 RestKit 0.24.0 将 JSON NSString 映射到一个对象,其中我有一个 RKObjectMapping 以及相应的字典。

网上大部分解决方案都是参考RestKit 0.22及以下。

SO 上的一些解决方案会导致应用崩溃。

将本地字符串转换为对象的最简单方法是什么。考虑以下

代码更新

    RKMapperOperation *mapper = [[RKMapperOperation alloc] initWithRepresentation:parsedData mappingsDictionary:[RJobObject mappingDictionary]];
    RJobObject * rrrr = [[RJobObject alloc] init];
    mapper.targetObject = rrrr;
    //mapper.mappingOperationDataSource = parsedData;


    [mapper execute:nil];

这里,mappingDictionary基本上就是JSON键和Object变量名匹配的键值对 所以在上面的代码中,每当我运行execute 时,应用程序就会崩溃。

堆栈跟踪

    2015-11-22 09:12:29.193 Help[22427:699579] -[__NSCFConstantString forceCollectionMapping]: unrecognized selector sent to instance 0x1022736a0
    2015-11-22 09:12:29.211 Help[22427:699579] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString forceCollectionMapping]: unrecognized selector sent to instance 0x1022736a0'
    *** First throw call stack:
    (
     0   CoreFoundation                      0x0000000105d7dc65 __exceptionPreprocess + 165
     1   libobjc.A.dylib                     0x0000000105a14bb7 objc_exception_throw + 45
     2   CoreFoundation                      0x0000000105d850ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
     3   CoreFoundation                      0x0000000105cdb13c ___forwarding___ + 988
     4   CoreFoundation                      0x0000000105cdacd8 _CF_forwarding_prep_0 + 120
     5   Help                                0x000000010212f424 -[RKMapperOperation mapRepresentationOrRepresentations:atKeyPath:usingMapping:] + 132
     6   Help                                0x000000010212fe97 -[RKMapperOperation mapSourceRepresentationWithMappingsDictionary:] + 1959
     7   Help                                0x00000001021307a2 -[RKMapperOperation main] + 1330
     8   Foundation                          0x00000001034c4774 -[__NSOperationInternal _start:] + 645
     9   Help                                0x00000001021310b7 -[RKMapperOperation execute:] + 39
     10  Help                                0x0000000101f62f8e -[AppDelegate fetchJobsFromDB] + 1102

更多详情

更新到 RestKit 0.26.0 ,我仍然面临这个问题。

基本上在RKMapperOperation.m333 行中,po mapping.forceCollectionMapping 给出了一个错误并导致应用程序崩溃。

答案:示例解决方案 使用RKMappingOperation,因为我们不必指定keyPath

    RJobObject * rrrJob = [RJobObject new];
    RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:jobEntity.dictionary destinationObject:rrrJob mapping:[RJobObject mapping]];
    mappingOperation.dataSource = (id)rrrJob;
    [mappingOperation start];

【问题讨论】:

显示您拥有的代码并提供崩溃的详细信息,包括消息和堆栈跟踪 @Wain :添加了代码、堆栈跟踪以及更多信息。如果可以的话请帮忙。谢谢 【参考方案1】:

对于您要执行的操作,“parsedData”应该是从 JSON 字符串反序列化的字典或数组,[RJobObject mappingDictionary] 应该是字典,其中键是源键路径,值是 @ 987654322@ 定义如何处理内容的实例。

这个想法是,关键路径决定了如何钻取 JSON 数据,而映射决定了如何处理在那里找到的内容。如果您想处理整个 JSON 数据,您的密钥路径可能是一个空字符串。

如果您想避免关键路径的复杂性并将整个 JSON 映射到单个目标对象,则可以考虑使用 RKMappingOperation

【讨论】:

感谢 RKmappingOperation 的建议,已将问题本身的解决方案发布为 Answer 。但是,一个问题,正如您所见,我必须输入 DestinationObjectDataSource 作为同一个对象,这不是多余的。这两者在什么情况下会有所不同? IIRC 在这种情况下您不需要数据源。数据源提供需要创建的实例,尤其是核心数据和多实例结果集。

以上是关于如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RKObjectMapping 进行递归映射?

RestKit/RKObjectMapping:从服务器加载数据后如何添加其他属性?

RestKit RKObjectMapping 嵌套 json

RestKit:给定 RKObjectMapping、object.class 和 JSON 字符串,如何获取映射对象?

带有查询参数的 RestKit postObject

使用 RKObjectMapping 的嵌套映射