使用 Mantle 将多个键组合成单个 属性
Combine multiple keys into single property using Mantle
我在请求的 JSON 正文中收到多个纬度和经度键。
{
...
latitude: "28.4949762000",
longitude: "77.0895421000"
}
我想将它们组合成一个 CLLocation 属性,同时将它们转换成我的 JSON 模型:
#import <Mantle/Mantle.h>
@import CoreLocation;
@interface Location : MTLModel <MTLJSONSerializing>
@property (nonatomic, readonly) float latitude;
@property (nonatomic, readonly) float longitude; //These are the current keys
@property (nonatomic, readonly) CLLocation* location; //This is desired
@end
我该如何实现同样的目标?
终于找到答案here。这是一种非常巧妙的方式,我很惊讶地看到文档中没有明确提及它。
将多个键组合成单个对象的方法是在 +JSONKeyPathsByPropertyKey
方法中使用数组将目标 属性 映射到多个键。当您这样做时,Mantle 将在它们自己的 NSDictionary
实例中提供多个密钥。
+(NSDictionary *)JSONKeyPathsByPropertyKey
{
return @{
...
@"location": @[@"latitude", @"longitude"]
};
}
如果目标 属性 是一个 NSDictionary,那么您就设置好了。否则,您需要在 +JSONTransformerForKey
或 +propertyJSONTransformer
方法中指定转换。
+(NSValueTransformer*)locationJSONTransformer
{
return [MTLValueTransformer transformerUsingForwardBlock:^CLLocation*(NSDictionary* value, BOOL *success, NSError *__autoreleasing *error) {
NSString *latitude = value[@"latitude"];
NSString *longitude = value[@"longitude"];
if ([latitude isKindOfClass:[NSString class]] && [longitude isKindOfClass:[NSString class]])
{
return [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
}
else
{
return nil;
}
} reverseBlock:^NSDictionary*(CLLocation* value, BOOL *success, NSError *__autoreleasing *error) {
return @{@"latitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.latitude] : [NSNull null],
@"longitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.longitude]: [NSNull null]};
}];
}
我在请求的 JSON 正文中收到多个纬度和经度键。
{
...
latitude: "28.4949762000",
longitude: "77.0895421000"
}
我想将它们组合成一个 CLLocation 属性,同时将它们转换成我的 JSON 模型:
#import <Mantle/Mantle.h>
@import CoreLocation;
@interface Location : MTLModel <MTLJSONSerializing>
@property (nonatomic, readonly) float latitude;
@property (nonatomic, readonly) float longitude; //These are the current keys
@property (nonatomic, readonly) CLLocation* location; //This is desired
@end
我该如何实现同样的目标?
终于找到答案here。这是一种非常巧妙的方式,我很惊讶地看到文档中没有明确提及它。
将多个键组合成单个对象的方法是在 +JSONKeyPathsByPropertyKey
方法中使用数组将目标 属性 映射到多个键。当您这样做时,Mantle 将在它们自己的 NSDictionary
实例中提供多个密钥。
+(NSDictionary *)JSONKeyPathsByPropertyKey
{
return @{
...
@"location": @[@"latitude", @"longitude"]
};
}
如果目标 属性 是一个 NSDictionary,那么您就设置好了。否则,您需要在 +JSONTransformerForKey
或 +propertyJSONTransformer
方法中指定转换。
+(NSValueTransformer*)locationJSONTransformer
{
return [MTLValueTransformer transformerUsingForwardBlock:^CLLocation*(NSDictionary* value, BOOL *success, NSError *__autoreleasing *error) {
NSString *latitude = value[@"latitude"];
NSString *longitude = value[@"longitude"];
if ([latitude isKindOfClass:[NSString class]] && [longitude isKindOfClass:[NSString class]])
{
return [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
}
else
{
return nil;
}
} reverseBlock:^NSDictionary*(CLLocation* value, BOOL *success, NSError *__autoreleasing *error) {
return @{@"latitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.latitude] : [NSNull null],
@"longitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.longitude]: [NSNull null]};
}];
}