在将Mantle更新为2.0之后,以下解析JSON的代码对我不再起作用。它们可以在较早的Mantle版本上正常工作(我不记得正确的版本号。我知道我是在2013年11月下载的。)
这是JSON内容:
{
date = "2015-05-21";
error = 0;
results = (
{
currentCity = "beijing";
index = (
{
des = "desc1";
tipt = "tipt1";
title = "title1";
zs = "zs1";
},
{
des = "desc2";
tipt = "tipt2";
title = "title2";
zs = "zs2";
},
{
des = "desc3";
tipt = "tipt3";
title = "title3";
zs = "zs3";
}
);
}
);
status = success;
}
我定义的模型:
// .h
#import "MTLModel.h"
#import "Mantle.h"
@interface BaiduWeatherResults : MTLModel<MTLJSONSerializing>
@property (nonatomic, strong) NSNumber *error;
@property (nonatomic, strong) NSString *status;
@property (nonatomic, strong) NSString *date;
@property (nonatomic, strong) NSString *currentCity;
@end
// .m
#import "BaiduWeatherResults.h"
@implementation BaiduWeatherResults
+ (NSDictionary *)JSONKeyPathsByPropertyKey
{
return @{
@"error" : @"error",
@"status" : @"status",
@"date" : @"date",
@"currentCity" : @"results.currentCity",
};
}
+ (NSValueTransformer *) currentCityJSONTransformer
{
return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSArray *values) {
return [values firstObject];
} reverseBlock:^(NSString *str) {
return @[str];
}];
}
将JSON解析为模型
id results =[MTLJSONAdapter modelOfClass:[BaiduWeatherResults class]
fromJSONDictionary:responseObject
error:nil];
NSLog(@"results:%@", results);
我的问题:
这些代码可以在较旧的外套上使用。在Mantle 2.0上,一旦我将@“ currentCity”:@“ results.currentCity”添加到JSONKeyPathsByPropertyKey返回的字典中,解析就会失败。有人知道我错过了解析吗?
顺便说一句,当解析开始时,currentCityJSONTransformer确实调用了。但是从未使用过转换器,因为该行“ return [values firstObject];”永远不会执行。
提前致谢。
最佳答案
尝试这个 -
+ (NSDictionary *)JSONKeyPathsByPropertyKey
{
return @{
@"error" : @"error",
@"status" : @"status",
@"date" : @"date",
@"currentCity" : @"results",
};
}
+ (NSValueTransformer *) currentCityJSONTransformer
{
return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSArray *values) {
NSDictionary *cityInfo = [values firstObject];
return cityInfo[@"currentCity"];
} reverseBlock:^(NSString *str) {
return @[@{@"currentCity" : str}];
}];
}
由于结果是字典数组,因此您无法通过
currentCity
中的点语法访问JSONKeyPathsByPropertyKey
。相反,currentCityJSONTransformer
在results数组中找到第一个字典,并为currentCity
返回其值。您可能需要添加类型检查并在单个位置定义@"currentCity"
键。