2014-03-29 3 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 배열을 가져온 다음 맨틀로 모든 객체를 구문 분석 할 수 있지만 잘 모르는 더 나은 방법이있는 것처럼 보입니다.

UPD : "server"개체의 단일 배열로 구성된 serverList에 문제가 있음이 분명합니다. 하지만 JSONKeyPathsByPropertyKey를 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];