带有 RestKit 0.2.0 的嵌套字典

Posted

技术标签:

【中文标题】带有 RestKit 0.2.0 的嵌套字典【英文标题】:Nested Dictionary with RestKit 0.2.0 【发布时间】:2013-06-11 21:17:29 【问题描述】:

我正在尝试使用 RestKit 0.20 处理包含嵌套字典的休息响应。这是我正在尝试处理的 json 响应:


"name": "Tom",
"msgTo": "Hi ",
"msgFrom": "Hey",
"uuid": "4",
"ClientInfo": 
    "Tom": 
        "AttributeA": "0",
        "AttributeB": "28"
    ,
    "Sam": 
        "AttributeA": "10",
        "AttributeB": "28"
    

问题在于 ClientInfo 对象。此对象是使用 pojo jackson 序列化从服务器获取的映射 [Map>] 的序列化 java 映射。

这是我用来处理响应的 ios/RestKit 中的 2 个模型:

@interface IAPClientInfo : NSObject
@property (weak, nonatomic) NSString * mapName;
@property (weak,nonatomic) NSString *propertyCount;
@property (weak,nonatomic) NSString *affinityValue;
@end

@interface IAPClientMessage : NSObject
@property (weak, nonatomic) NSString * name;
@property (weak, nonatomic) NSString * msgTo;
@property (weak, nonatomic) NSString * msgFrom;
@property (weak, nonatomic) NSString * uuid;
// should this be an array?
@property (weak, nonatomic) NSArray * iapClientInfoArray;
@end

这里是代码

// inner mapping
RKObjectMapping *clientInfoMapping = [RKObjectMapping mappingForClass:[IAPClientInfo class]];
[clientInfoMapping setForceCollectionMapping:YES];
[clientInfoMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"mapName"];
[clientInfoMapping addAttributeMappingsFromDictionary:@@"(mapName).AttributeA" : @"propertyCount", @"(mapName).AttributeB" : @"affinityValue"];

// outer mapping
RKObjectMapping *messageMapping = [RKObjectMapping mappingForClass:[IAPClientMessage class]];    
[messageMapping addAttributeMappingsFromDictionary:@@"msgFrom" : @"msgFrom",@"msgTo" : @"msgTo",@"uuid" : @"uuid",@"name" : @"name"];

// relationship b/w inner and outer   
RKRelationshipMapping *relationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"ClientInfo" toKeyPath:@"iapClientInfoArray" withMapping:clientInfoMapping];
[messageMapping addPropertyMapping:relationshipMapping];

// response
RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:messageMapping
                                                                                    pathPattern:nil
                                                                                        keyPath:@""
                                                                                  statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];

在处理响应时,除了 iapClientInfoArray 属性为空外,IAPClientMessage 中的属性都与预期相同。虽然有多个 IAPClientInfo 对象,但在 json 响应中,不清楚 IAPClientMessage 中的属性应该是什么(当前设置为 NSArray*)。有什么建议可以使这项工作正常进行吗?

发送。

【问题讨论】:

您是否能够更改服务器以将 ClientInfo 作为数组返回,并将名称作为数组中字典中的参数? 尝试开启跟踪日志 RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);因为你的代码看起来不错。 【参考方案1】:

我通过将所有属性从“弱”更改为“强”来实现这一点。

首先,我根据您的建议激活了日志记录

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

显示 IAPClientInfo 和 IAPClientMessage 对象已正确填充,表明基本设置没有问题。

IAPClientInfo 对象被正确填充但变为空,因此我怀疑存在内存管理问题。

阅读本文

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

阐明了所需的用法 - 我需要所有属性来“拥有”它们所指向的内容。因此,我需要他们使用“强”而不是“弱”语义。我正在使用ARC。一旦“创建”代码超出范围,“弱”语义导致指针(我怀疑)指向“nil”。

一旦以这种方式更改属性,一切都会按预期工作 - iapClientInfoArray * 指向正确构造的 IAPClientInfo 实例数组。

谢谢。

【讨论】:

以上是关于带有 RestKit 0.2.0 的嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

RESTKit:带有字典的 RKMappingResult

带有数组映射的restkit嵌套对象

RestKit RKObjectMapping .. 嵌套和一次性对象

RestKit 发布嵌套的托管对象会创建重复项

如何在带有嵌套字典的嵌套循环中正确使用字典“.update”函数[重复]

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