【问题标题】:Mantle: Uncaught exception 'NSInvalidArgumentException' when parsing JSONMantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”
【发布时间】:2015-09-02 05:19:37
【问题描述】:

我正在使用Mantle 框架,我似乎在将一些值序列化为MTLModel 时遇到了一些问题。这是我从服务器收到的JSON

{
    "id":50,
    "name":"UserName",
    "email":"user@username.com",
    "profile":{
        "picture": {
            "original": "http://original.com/picture",
            "versions": {
                "thumb": "http://thumb.com/picture",
                "small": "http://small.com/picture"
            }
        }
    }
}

我已经通过以下方式设置了我的MTLModels:

用户

@interface User : MTLModel <MTLJSONSerializing>

@property (nonatomic, readonly) NSNumber *id;
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *email;
@property (nonatomic) Profile *profile;

@end

@implementation User

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
            @"id": @"id",
            @"name": @"name",
            @"email": @"email",
            @"profile": @"profile"
            };
}

- (NSValueTransformer *)profileJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSDictionary *profileDict) {
        return [MTLJSONAdapter  modelOfClass:Profile.class
                            fromJSONDictionary:profileDict
                            error:nil];
    } reverseBlock:^(Profile *profile) {
        return [MTLJSONAdapter JSONDictionaryFromModel:profile];
   }];
}

@end

个人资料

@interface Profile : MTLModel <MTLJSONSerializing>

@property (nonatomic) Picture *picture;

@end

@implementation Profile

+ (NSDictionary *)JSONKeyPathsByPropertyKeys {
    return @{
            @"picture": @"picture"
           };
}

- (NSValueTransformer *)pictureJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSDictionary *picDict) {
        return [MTLJSONAdapter  modelOfClass:Picture.class
                            fromJSONDictionary:picDict
                            error:nil];
    } reverseBlock:^(Picture *picture) {
        return [MTLJSONAdapter JSONDictionaryFromModel:picture];
    }];
}

@end

图片

@interface Picture : MTLModel <MTLJSONSerializing>

@property (nonatomic) NSString *original;
@property (nonatomic) Versions *versions;

@end

@implementation Picture

+ (NSDictionary *)JSONKeyPathsByPropertyKeys {
    return @{
            @"original": @"original",
            @"versions": @"versions"
           };
}

- (NSValueTransformer *)versionsJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSDictionary *versionDict) {
        return [MTLJSONAdapter  modelOfClass:Versions.class
                            fromJSONDictionary:versionDict
                            error:nil];
    } reverseBlock:^(Versions *versions) {
        return [MTLJSONAdapter JSONDictionaryFromModel:versions];
    }];
}

@end

版本

@interface Versions : MTLModel <MTLJSONSerializing>

@property (nonatomic) NSString *thumb;
@property (nonatomic) NSString *small;

@end

@implementation Versions

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
             @"thumb": @"thumb",
             @"small": @"small"
             };
}

@end

我正在执行以下Overcoat POST 调用来获取 JSON。当我NSLog 响应时,我收到了 JSON 格式:

[[Client getInstance] POST:@"authorize.json" parameters:params completion:^(id response, NSError *error) {
    if (!error) {
        User *user = [MTLJSONAdapter modelOfClass:[User class] fromJSONDictionary:[response result] error:nil];
        Picture *picture = [[user profile] picture];
        NSLog(@"%@", picture);
    } else {
        NSLog(@"%@", error);
    }
}];

当我尝试像这样抓取Picture 对象时出现问题:

Picture *picture = [[user profile] picture];

我得到一个例外:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary picture]: unrecognized selector sent to instance 0x7f95026d4210'

我该如何解决这个问题?我做错了什么?

【问题讨论】:

    标签: ios json nsexception github-mantle


    【解决方案1】:

    您没有正确解析您的 json。图片字典嵌套在配置文件中。 得到它喜欢的东西

    Nsmutabledictinary *profile=[jsondic objectforkey:@"Profile"];

    Nsmutabledictinary *picture=[profile objectforkey:@"Picture"];

    请更正语法错误,因为我没有在编辑器中编写代码,因此代码中可能存在语法错误。谢谢

    【讨论】:

    • 我不相信这是正确的答案,这会破坏使用MTLModel 对象的目的。
    • 这也不会编译,因为objectForKey 不是MTLModel 函数。
    • 错误只是json解析不正确。我只是以正确的方式解析了json。谢谢
    • objectforkey 是 nsmutabledictionary 而非 MTLModel 的方法。
    • 这不回答我的问题,我的问题与Mantle有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多