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