JSONMODEL ARRAYOFMODELSFROMDICTITION-有时丢失键时的错误



,所以我刚刚开始使用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解析仍然可以使用而不会崩溃或问题...

相关内容

  • 没有找到相关文章

最新更新