JSONModel arrayOfModelsFromDictionaries - 当键缺少SOMETIMES时出错

时间:2014-02-03 19:41:24

标签: youtube-api jsonmodel

所以我刚刚开始使用youtube数据API和JSONModel。使用YouTubeBrowserDemo作为我的起点:https://github.com/JSONModel/YouTubeBrowserDemo

所以它的工作正常,但有时某些视频的MediaThumnail条目没有time条目。一些返回的视频有它们,有些则没有。我对此很好,当然我可以在显示数据时编写简单的检查,但是当调用arrayOfModelsFromDictionaries将返回的JSON转换为我的模型时,我得到以下错误,并且没有JSON是如果只有一个(或多个)time条目丢失,则转换:

[JSONModel.m:205] Incoming data was invalid [MediaThumbnail initWithDictionary:]. Keys missing: {(
    time
)}

如何进行此转换不是全有或全无转换?映射时有哪些条件检查?或者是否有一个不同的JSONModel方法已经这样做了?


这是API调用并尝试转换生成的JSON:

 [JSONHTTPClient getJSONFromURLWithString:searchURL
                                  completion:^(NSDictionary *json, JSONModelError *err) {


                                      //got JSON back
                                      NSLog(@"Got JSON from web: %@", json);

                                      if (err) {

                                          NSLog(@"err = %@",err);



                                          [[[UIAlertView alloc] initWithTitle:@"Error"
                                                                      message:[err localizedDescription]
                                                                     delegate:nil
                                                            cancelButtonTitle:@"Close"
                                                            otherButtonTitles: nil] show];
                                          return;
                                      }




                                      //initialize the models 
                                      // THIS IS WHERE IT SOMETIMES RETURNS OBJECTS INTO SELF.OBJECTS IF ALL THE MEDIATHUMBNAILS AHVE TIME ENTRIES, OR NOTHING IF ONE OR MORE ARE MISSING
                                      self.objects = [VideoModel arrayOfModelsFromDictionaries:
                                                      json[@"feed"][@"entry"]
                                                      ];




                                      if (self.objects) {
                                          NSLog(@"Loaded successfully models");

                                      }

这是我的VideoModel.h接近他们的 - 只有一个附加属性:

@interface VideoModel : JSONModel

@property (strong, nonatomic) NSString* title;
@property (strong, nonatomic) NSArray<VideoLink>* link;
@property (strong, nonatomic) NSArray<MediaThumbnail>* thumbnail;
@property (strong, nonatomic) NSArray<Author>* author;

@end

VideoModel.m:

@implementation VideoModel

+(JSONKeyMapper*)keyMapper
{
    return [[JSONKeyMapper alloc] initWithDictionary:@{
            @"media$group.media$thumbnail":@"thumbnail",
            @"title.$t": @"title"
            }];
}

@end

我的MediaThumnail.h:

@interface MediaThumbnail : JSONModel

@property (strong, nonatomic) NSURL* url;
@property (assign, nonatomic) int width;
@property (assign, nonatomic) int height;
@property (strong, nonatomic) NSString* time;

@end

MediaThumnail.m:

@implementation MediaThumbnail

@end

2 个答案:

答案 0 :(得分:1)

使用JSONModel可以很容易地使用模型的某些属性 - 在这里查看示例(有关同一页面上不同功能的更多示例):

https://github.com/icanzilb/JSONModel#optional-properties-ie-can-be-missing-or-null

总而言之,您需要添加&lt; Optional&gt;您的财产的协议,如下:

@property (strong, nonatomic) NSString<Optional>* time;

就是这样。当使用属性首先检查它是否为零或有值时,请不要忘记。

答案 1 :(得分:0)

创建一个NSNull + JSON类别,并将其导入JSONModel.m或{ProjectName} -Prefix.pch

#import <Foundation/Foundation.h>

@interface NSNull (JSON)

@end

#import "NSNull+JSON.h"

@implementation NSNull (JSON)

- (NSUInteger)length { return 0; }

- (NSInteger)integerValue { return 0; };

- (NSInteger)intValue { return 0; };

- (float)floatValue { return 0; };

- (NSString *)description { return @"0(NSNull)"; }

- (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; }

- (id)objectForKey:(id)key { return nil; }

- (BOOL)boolValue { return NO; }

@end

我在许多项目中一直在使用它。我更喜欢使用此过程,因此即使我的服务器为API响应引入了任何新的JSON密钥,JSON解析仍然可以正常工作,而不会发生崩溃或问题...