2015-05-29 153 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