Mantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”

Posted

技术标签:

【中文标题】Mantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”【英文标题】:Mantle: Uncaught exception 'NSInvalidArgumentException' when parsing JSON 【发布时间】: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'

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我不相信这是正确的答案,这会破坏使用MTLModel 对象的目的。 这也不会编译,因为objectForKey 不是MTLModel 函数。 错误只是json解析不正确。我只是以正确的方式解析了json。谢谢 objectforkey 是 nsmutabledictionary 而非 MTLModel 的方法。 这不回答我的问题,我的问题与Mantle有关

以上是关于Mantle:解析 JSON 时未捕获的异常“NSInvalidArgumentException”的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Mantle 在 iOS 中解析嵌套的 json

选择图像时未捕获的异常“NSInvalidArgumentException”

由于运行应用程序时未捕获的异常而终止应用程序

DbUpdateException- 在我捕获所有异常时未处理重复的键错误

在 JSON.parse 期间在节点中捕获异常