地幔:未捕获的异常' NSInvalidArgumentException'解析JSON时

时间:2015-09-02 05:19:37

标签: ios json nsexception github-mantle

我正在使用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"
            }
        }
    }
}

我已按以下方式设置MTLModel

用户

@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'

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

1 个答案:

答案 0 :(得分:4)

你没有正确解析你的json。图片字典嵌套在个人资料中。 得到它像什么

Nsmutabledictinary * profile = [jsondic objectforkey:@&#34; Profile&#34;];

Nsmutabledictinary * picture = [profile objectforkey:@&#34; Picture&#34;];

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