Mantle 2.0无法解析数组嵌套

时间:2015-05-21 11:09:11

标签: ios objective-c json parsing github-mantle

在将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上,一旦我添加了@&#34; currentCity&#34; :@&#34; results.currentCity&#34;进入JSONKeyPathsByPropertyKey返回的字典中。有人知道我错过了解析吗?

顺便说一下,currentCityJSONTransformer在解析开始时调用了。但变压器从未使用过,因为线路&#34;返回[值firstObject];&#34;永远不会被执行。

提前致谢。

1 个答案:

答案 0 :(得分:1)

试试这个 -

+ (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找到结果数组中的第一个字典并返回其currentCity的值。您可能希望添加类型检查并在单个位置定义@"currentCity"键。