2014-03-29 35 views
1

我想解析這個JSON:https://api.guildwars2.com/v1/world_names.json?lang=en 我使用地幔。所以我做了兩個類:server和serverList。JSON解析與地幔

//server.m:

@implementation GW2Server 

+ (NSDictionary *)JSONKeyPathsByPropertyKey 
{ 
    return @{ 
      @"serverID": @"id", 
      @"serverName": @"name", 
      }; 
} 

+ (NSValueTransformer *)serverIDJSONTransformer 
{ 
    return [MTLValueTransformer reversibleTransformerWithBlock:^(NSString *stringFromJSON){ 
     NSNumberFormatter *formatter = [NSNumberFormatter new]; 
     [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
     return [formatter numberFromString:stringFromJSON]; 
    }]; 
} 

+ (NSValueTransformer *)serverNameJSONTransformer 
{ 
    return [MTLValueTransformer reversibleTransformerWithBlock:^(NSString *stringFromJSON){ 
     return stringFromJSON; 
    }]; 
} 

@end 

//serverList.m

@implementation GW2ServerList 

+(NSDictionary *)JSONKeyPathsByPropertyKey 
{ 
    return @{ 
      @"serverID": @"serverList.serverID", 
      @"serverName": @"serverList.serverName", 
      }; 
} 

+ (NSValueTransformer *)serverListJSONTransformer 
{ 
    return [MTLValueTransformer mtl_JSONArrayTransformerWithModelClass:[GW2Server class]]; 
} 

@end 

問題是,當我嘗試使用[MTLJSONAdapter modelOfClass:[GW2ServerList類] fromJSONDictionary:jSONDict錯誤: NULL],看起來它不能用於JSON數組。而我的JSON實際上是數組。那麼我該如何解決這個問題呢? 我可以得到JSON數組,然後使用Mantle解析其中的每個對象,但是看起來好像還有一個我不知道的更好的方法。

UPD:很明顯,問題出在serverList中,它由一組「服務器」對象組成。但我不知道如何正確地爲它重寫JSONKeyPathsByPropertyKey(因爲在JSON中沒有像數組這樣的對象 - 它是數組本身或類似的東西)。

回答

1

已解決! 所有我應該做的是讓字典從JSON數組是這樣的:

NSArray *jSONArray = [NSJSONSerialization JSONObjectWithData:data options:0 
                    error:NULL]; 
NSDictionary *jSONDict = @{@"serverList": jSONArray}; 

然後纔有可能解析它像往常一樣:

self.serverList = [MTLJSONAdapter modelOfClass:[GW2ServerList class] 
             fromJSONDictionary:jSONDict 
                error:NULL]; 
0

這僅僅是一個完整的例子@瑪麗亞解決方案也使用Mantel

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"json"]; 
NSData *jsonData = [NSData dataWithContentsOfFile:filePath]; 
NSError *error = nil; 
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
NSLog(@"%@", dataDictionary); 
EventParticipant* ev = [MTLJSONAdapter modelOfClass:[EventParticipant class] 
          fromJSONDictionary:dataDictionary 
             error:NULL];