2014-03-29 34 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];