Youtube api JsonModelArrayOfModelsFromDictionaries——有时缺少键时出错

Youtube api JsonModelArrayOfModelsFromDictionaries——有时缺少键时出错,youtube-api,jsonmodel,Youtube Api,Jsonmodel,所以我刚刚开始学习youtube数据API和JSONModel。使用他们的YouTubeBrowserDemo作为我的起点: 因此,它工作正常,只是某些视频的MediaThumMail条目有时没有时间条目。有些退回的视频有,有些没有。我对此很满意,当然可以在显示数据时编写简单的检查,但是当调用arrayOfModelsFromDictionaries将返回的JSON转换为我的模型时,我会得到以下错误,如果只缺少一个(或多个)time条目,则不会转换任何JSON: [JSONModel.m:205

所以我刚刚开始学习youtube数据API和JSONModel。使用他们的
YouTubeBrowserDemo
作为我的起点:

因此,它工作正常,只是某些视频的MediaThumMail条目有时没有
时间
条目。有些退回的视频有,有些没有。我对此很满意,当然可以在显示数据时编写简单的检查,但是当调用
arrayOfModelsFromDictionaries
将返回的JSON转换为我的模型时,我会得到以下错误,如果只缺少一个(或多个)
time
条目,则不会转换任何JSON:

[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");

                                      }
这是我的视频模型。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
还有我的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

使用JSONModel可以很容易地使模型的某些属性成为可选的-在这里看一看示例(在同一页上有更多关于不同特性的示例):

总之,您需要做的是将协议添加到您的属性中,如下所示:

@property (strong, nonatomic) NSString<Optional>* time;
@property(强,非原子)NSString*时间;

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

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

总之,您需要做的是将协议添加到您的属性中,如下所示:

@property (strong, nonatomic) NSString<Optional>* time;
@property(强,非原子)NSString*时间;

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

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

总之,您需要做的是将协议添加到您的属性中,如下所示:

@property (strong, nonatomic) NSString<Optional>* time;
@property(强,非原子)NSString*时间;

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

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

总之,您需要做的是将协议添加到您的属性中,如下所示:

@property (strong, nonatomic) NSString<Optional>* time;
@property(强,非原子)NSString*时间;

就这样。当使用属性首先检查它是nil还是有值时,不要忘记。

创建一个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
#导入
@接口NSNull(JSON)
@结束
#导入“NSNull+JSON.h”
@实现NSNull(JSON)
-(整数)长度{返回0;}
-(NSInteger)整型值{返回0;};
-(NSInteger)intValue{return 0;};
-(float)floatValue{返回0;};
-(NSString*)说明{return@“0(NSNull)”;}
-(NSArray*)组件由字符串分隔:(NSString*)分隔符{return@[];}
-(id)objectForKey:(id)键{return nil;}
-(BOOL)boolValue{返回NO;}
@结束

我已经在我的许多项目中使用了它。我更喜欢使用这个过程,因此即使我的服务器为API响应引入了任何新的JSON键,JSON解析仍然可以工作,不会出现任何崩溃或问题…

创建一个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
#导入
@接口NSNull(JSON)
@结束
#导入“NSNull+JSON.h”
@实现NSNull(JSON)
-(整数)长度{返回0;}
-(NSInteger)整型值{返回0;};
-(NSInteger)intValue{return 0;};
-(float)floatValue{返回0;};
-(NSString*)说明{return@“0(NSNull)”;}
-(NSArray*)组件由字符串分隔:(NSString*)分隔符{return@[];}
-(id)objectForKey:(id)键{return nil;}
-(BOOL)boolValue{返回NO;}
@结束

我已经在我的许多项目中使用了它。我更喜欢使用这个过程,因此即使我的服务器为API响应引入了任何新的JSON键,JSON解析仍然可以工作,不会出现任何崩溃或问题…

创建一个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
#导入
@接口NSNull(JSON)
@结束
#导入“NSNull+JSON.h”
@实现NSNull(JSON)
-(整数)长度{返回0;}
-(NSInteger)整型值{返回0;};
-(NSInteger)intValue{return 0;};
-(float)floatValue{返回0;};
-(NSString*)说明{return@“0(NSNull)”;}
-(NSArray*)组件由字符串分隔:(NSString*)分隔符{return@[];}
-(id)objectForKey:(id)键{return nil;}
-(BOOL)boolValue{返回NO;}
@结束

我已经在我的许多项目中使用了它。我更喜欢使用这个过程,因此即使我的服务器为API响应引入了任何新的JSON键,JSON解析仍然可以工作,不会出现任何崩溃或问题…

创建一个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
#导入
@接口NSNull(JSON)
@结束
#导入“NSNull+JSON.h”
@实现NSNull(JSON)
-(整数)长度{返回0;}
-(NSInteger)整型值{返回0;};
-(NSInteger)intValue{return 0;};
-(float)floatValue{返回0;};
-(NSString*)说明{return@“0(NSNull)”;}
-(NSArray*)组件由字符串分隔:(NSString*)分隔符{return@[];}
-(id)objectForKey:(id)键{return nil;}
-(BOOL)boolValue{返回NO;}
@结束
我已经在我的许多项目中使用了它。我更喜欢使用这个过程,因此即使我的服务器为API响应引入了任何新的JSON键,JSON解析仍然可以工作,不会出现任何崩溃或问题…

注意:所有