Mantle 2.0 无法为嵌套数组中的符号解析 JSON

Posted

技术标签:

【中文标题】Mantle 2.0 无法为嵌套数组中的符号解析 JSON【英文标题】:Mantle 2.0 cannot parse JSON for the notation in array nested 【发布时间】:2015-05-21 11:09:10 【问题描述】:

在我将 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 上运行。在 Mantle 2.0 上,一旦我将 @"currentCity" : @"results.currentCity" 添加到 JSONKeyPathsByPropertyKey 返回的字典中,解析就会失败。有人知道我在解析中错过了什么吗?

顺便说一句,解析开始时 currentCityJSONTransformer 确实调用了。但从未使用过转换器,因为“return [values firstObject];”这一行永远不会被执行。

提前致谢。

【问题讨论】:

【参考方案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];
    ];

由于 results 是一个字典数组,因此您无法通过 JSONKeyPathsByPropertyKey 中的点语法访问 currentCity。相反,currentCityJSONTransformer 会在结果数组中找到第一个字典并返回它的值 currentCity。您可能希望添加类型检查并在一个地方定义 @"currentCity" 键。

【讨论】:

非常感谢。这可以工作。但是,按照这个,我只能转换indexJSONTransformer中的“index”数组,像这样? ' NSArray array = (NSArray) 值; NSDictionary *resultDict = [数组 firstObject]; NSArray *indexArray = resultDict[@"index"]; return [MTLJSONAdapter modelsOfClass:[BaiduWeatherIndex class] fromJSONArray:indexArray error:nil];' 从您的问题看来,您只对 currentCity 属性感兴趣。如果你也想要索引数组,你应该创建一个 MTLModel 对象来表示每个索引。然后使用mtl_JSONDictionaryTransformerWithModelClass: 方法在其JSONtransformer 中实例化每个索引模型对象。如果您愿意,也可以对结果数组的每个成员使用相同的方法。

以上是关于Mantle 2.0 无法为嵌套数组中的符号解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Mantle - 映射嵌套数据结构

无法在 Android Studio 2.0 中解析符号 R [重复]

如何将菊花链/点符号中的 JavaScript 对象展开为具有嵌套对象和数组的对象?

维护嵌套元素的分组方法 XSLT 2.0 - 分离多余的

带空格的字符串无法转换为 NSURL - Mantle

使用 Mantle 在 JSON 数组中将 NSString 转换为 NSURL