所以我刚刚开始使用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
答案 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解析仍然可以正常工作,而不会发生崩溃或问题...