,所以我刚刚开始使用youtube数据API和JSONMODEL。使用他们的YouTubeBrowserDemo
作为我的起点:https://github.com/jsonmodel/youtubebrowserdemo。
因此,它可以正常工作,除非有时某些视频的MediaThumnailail条目没有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
很容易与JSONMODEL一起使您的某些模型的某些属性可选 - 在此处查看一个示例(同一页面上有关不同功能的更多示例):
https://github.com/icanzilb/jsonmodel#optional-properties-ie-can-be-be-be-be-missing-or-null
您需要做的一切都是添加&lt;可选&gt;属性的协议,例如:
@property (strong, nonatomic) NSString<Optional>* time;
就是这样。不要忘记使用该属性首先检查是否为零或具有价值。
创建一个NSNULL JSON类别,并在jsonmodel.m或{projectName} -prefix.pch.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解析仍然可以使用而不会崩溃或问题...