Mantle - 映射嵌套数据结构

Posted

技术标签:

【中文标题】Mantle - 映射嵌套数据结构【英文标题】:Mantle - Mapping Nested Data Structure 【发布时间】:2015-05-29 06:36:44 【问题描述】:

我有一个稍微复杂的嵌套 JSON 对象,我需要将其映射到 Objective-C 类。我认为我需要做的是在映射时跳过 JSON 中的级别。这就是我的意思:

我想映射以下 JSON 字典:

NSDictionary *JSONDictionary = @
         @"status" : @"PASSWORD_EXPIRED",
         @"_embedded" : @
                 @"user" : @
                         @"id" : @"00ub0oNGTSWTBKOLGLNR",
                         @"profile" : @
                                 @"login" : @"isaac@example.org",
                                 @"firstName" : @"Isaac",
                                 @"lastName" : @"Brock",
                                 @"locale" : @"en_US",
                                 @"timeZone" : @"America/Los_Angeles"
                                 
                         
                 
         ;

@interface Authentication : MTLModel <MTLJSONSerializing>
@property (strong, nonatomic) NSDate* expiresAt;
@property (strong, nonatomic) NSString* status;
@property (strong, nonatomic) NSString* relayState;
@property (strong, nonatomic) NSString* sessionToken;
@property (strong, nonatomic) NSString* stateToken;

//Embeded Resources
@property (strong, nonatomic) User* user;
@end

如您所见,我没有为“_embeded”创建对象。我正在跳过它并将用户映射到用户对象。

这可以实现吗?如果有怎么办?

我已经在实现中尝试过,但没有成功:

@implementation Authentication
+ (NSDictionary*)JSONKeyPathsByPropertyKey 
    return @
             @"expiresAt" : @"expiresAt",
             @"status" : @"status",
             @"sessionToken" : @"sessionToken",
             @"stateToken" : @"stateToken",
             @"relayState" : @"relayState",
             @"user" : @"_embeded/user",
             ;


+ (NSValueTransformer *)userJSONTransformer 
    return [NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:User.class];

@end

【问题讨论】:

【参考方案1】:

我以前是用下面的代码来做的:

+ (NSValueTransformer *)userJSONTransformer 
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^id(NSDictionary *userDict) 
        return [MTLJSONAdapter modelOfClass:[User class] fromJSONDictionary:userDict error:nil];
     reverseBlock:^id(User *user) 
        return [MTLJSONAdapter JSONDictionaryFromModel:user];
    ];

还有+JSONKeyPathsByPropertyKey,我觉得应该是@"user" : @"_embeded.user"

【讨论】:

另见-[MTLJSONAdapter transformerForModelPropertiesOfClass:]

以上是关于Mantle - 映射嵌套数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Mantle 2.0 无法为嵌套数组中的符号解析 JSON

iOS Mantle Overcoat 实体 ID 映射数组

字典转模型框架 Mantle的使用:国外程序员最常用的iOS模型

将 Mantle 与核心数据一起使用 - NSSet 和 NSArray

Mantle,JSONModel,MJExtension,YYModel的比较

反应:映射嵌套的对象数组