2015-05-29 112 views
0

我有一个稍微复杂的嵌套JSON对象,我需要映射到Objective-C类。有人认为我需要做的是在映射时跳过JSON中的级别。这里是我的意思是:地幔映射嵌套数据结构

我要地图以下JSON字典:

NSDictionary *JSONDictionary = @{ 
     @"status" : @"PASSWORD_EXPIRED", 
     @"_embedded" : @{ 
       @"user" : @{ 
         @"id" : @"00ub0oNGTSWTBKOLGLNR", 
         @"profile" : @{ 
           @"login" : @"[email protected]", 
           @"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 

回答

2

我用下面的代码来做到这一点:

+ (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"

+0

工作正常!你达人。非常感谢。 – Chandra

+0

请参阅' - [MTLJSONAdapter transformerForModelPropertiesOfClass:]''。 – Netsu