0

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 では、 JSONKeyPathsByPropertyKey によって返される辞書に @"currentCity" : @"results.currentCity" を追加すると、解析が失敗しました。解析で見逃したものを知っている人はいますか?

ところで、解析が開始されたときに currentCityJSONTransformer が呼び出されました。ただし、「return [values firstObject];」という行があるため、トランスフォーマーは使用されません。実行されることはありません。

前もって感謝します。

4

1 に答える 1

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}];
    }];
}

currentCityresults は辞書の配列であるため、 のドット構文でアクセスすることはできませんJSONKeyPathsByPropertyKey。代わりcurrentCityJSONTransformerに、結果配列で最初のディクショナリが検索され、その値が に返されますcurrentCity。型チェックを追加して、@"currentCity"キーを 1 か所で定義したい場合があります。

于 2015-05-21T11:19:46.297 に答える