Objective c 使用RestKit 0.20的谷歌地理编码API
我不知道如何优雅地解析这个响应。我试图将不同的字段类型与包含以下属性的对象相匹配Objective c 使用RestKit 0.20的谷歌地理编码API,objective-c,json,google-maps,ios6,restkit,Objective C,Json,Google Maps,Ios6,Restkit,我不知道如何优雅地解析这个响应。我试图将不同的字段类型与包含以下属性的对象相匹配 @property (nonatomic) NSString *name; @property (nonatomic) NSString *address; @property (nonatomic) NSString *city; @property (nonatomic) NSString *postalcode; @property (nonatomic) NSString *district; @prope
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *address;
@property (nonatomic) NSString *city;
@property (nonatomic) NSString *postalcode;
@property (nonatomic) NSString *district;
@property (nonatomic) NSString *country;
过去我查字典时,子字段与我搜索的字段匹配
{
"results" : [
{
"address_components" : [
{
"long_name" : "10",
"short_name" : "10",
"types" : [ "street_number" ]
},
{
"long_name" : "Warschauer Straße",
"short_name" : "Warschauer Straße",
"types" : [ "route" ]
},
{
"long_name" : "Friedrichshain",
"short_name" : "Friedrichshain",
"types" : [ "sublocality", "political" ]
},
{
"long_name" : "Friedrichshain-Kreuzberg",
"short_name" : "Friedrichshain-Kreuzberg",
"types" : [ "sublocality", "political" ]
},
{
"long_name" : "Berlin",
"short_name" : "Berlin",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Berlin",
"short_name" : "Berlin",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Germany",
"short_name" : "DE",
"types" : [ "country", "political" ]
},
{
"long_name" : "10243",
"short_name" : "10243",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "Warschauer Straße 10, 10243 Berlin, Germany",
"geometry" : {
"location" : {
"lat" : 52.51329350,
"lng" : 13.45246930
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 52.51464248029150,
"lng" : 13.45381828029150
},
"southwest" : {
"lat" : 52.51194451970850,
"lng" : 13.45112031970850
}
}
},
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
如前所述,使用Restkit映射此对象没有优雅的方法,相反,您可以将此格式直接映射到一个“丑陋的对象”,并使用另一个具有所需接口的对象包装该对象
比如:
@interface MYMappedAddress : NSObject
@property (nonatomic) NSArray *addressComponents;
@property (nonatomic) NSArray *types;
@property (nonatomic) MYGeometry *geometry;
@property (nonatomic) NSString * formattedAddress;
@end
@interface MYAddress : MYMappedAddress
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *address;
@property (nonatomic) NSString *city;
@property (nonatomic) NSString *postalcode;
@property (nonatomic) NSString *district;
@property (nonatomic) NSString *country;
@end
嗯。我想出了以下解决办法。我已经定义了一个字典并重写了Setter,以便将传入的字典解析到我自己的解析器中:
-(void)addressByGoogle: (NSDictionary*)newAddressComponents{
for (NSArray *googleResult in newAddressComponents) {
for (NSArray *fields in googleResult) {
if ([[fields valueForKey:@"types"] count] >= 1) {
NSString *googleType = [[fields valueForKey:@"types"] objectAtIndex:0];
if ( [googleType isEqualToString:@"sublocality"]) {
self.district = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"country"]) {
self.country = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"locality"]) {
self.city = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"street_number"]) {
self.streetnumber = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"route"]) {
self.address = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"postal_code"]) {
self.postalcode = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"administrative_area_level_1"]) {
self.adminAreaLevel1 = [fields valueForKey:@"long_name"];
}
if ( [googleType isEqualToString:@"administrative_area_level_2"]) {
self.adminAreaLevel2 = [fields valueForKey:@"long_name"];
}
}
}
}
}
- (void) setAddressComponents:(NSDictionary *)newAddressComponents{
[self addressByGoogle: newAddressComponents];
}
没有“优雅”的方式。只需硬编码完整的getter,将它们映射到JSON,正如您在这里看到的那样。