Mantle 2.0 не может проанализировать JSON для записи в массиве

Следующие разборы кода JSON больше не работают для меня после того, как я обновил Mantle до 2.0. Они могут нормально работать на более старой версии Mantle (я не помню правильный номер версии. Что я знаю, так это то, что я скачал его в ноябре 2013 года.)

Вот содержимое 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];" никогда не выполняется.

Заранее спасибо.

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" ключ в одном месте.

Другие вопросы по тегам