JSONModel返回nil

时间:2013-09-19 09:18:48

标签: objective-c json nsarray jsonmodel

我正在使用JSONModel从URL获取JSON。 这是一个非常简单的对象,只包含2个字符串 - “name”和“url”。

首先我制作了对象模型:

@protocol
Tutorial
@end
@interface Tutorial : JSONModel
@property (nonatomic, strong)   NSString *name;
@property (nonatomic, strong)   NSString *url;
@end

然后对象Feed:

#import "JSONModel.h"
#import "Tutorial.h"
@interface TutorialFeed : JSONModel
@property (nonatomic, strong)   NSArray <Tutorial> *tutorials;
@end

然后在MasterViewController.m中:

#import "MasterViewController.h"
#import "DetailViewController.h"
#import "TutorialFeed.h"
#import "JSONModelLib.h"

@interface MasterViewController () {
  TutorialFeed *feed;
  TutorialFeed *testFeed;
}
@end
@implementation MasterViewController
-(void)viewDidAppear:(BOOL)animated
{
    feed = [[TutorialFeed alloc]

initFromURLWithString:@"http://api.matematikfessor.dk/apps/teacher_videos"
       completion:^(JSONModel *model, JSONModelError *err) {
           NSLog(@"Tutorials %@", feed.tutorials);
       }];
 }
 @end

问题是,我在日志中返回nil :( 我不知道为什么会这样,因为我设法从这个URL获取JSON数据: Kiwa URL

完成所有操作,遵循此tutorial

我不确定我做错了什么。 有人有任何线索吗?

1 个答案:

答案 0 :(得分:6)

<强>解释

首先,JSONModel期望您的JSON顶级对象是一个字典,只有这样才能将其键与模型的属性相匹配。

你的名为TutorialFeed的模型希望得到与属性名称“tutorials”匹配的JSON。这意味着你的JSON提要必须采用以下形式:

  

{“tutorials”:[{obj1},{obj2},{obj3},...]}

事实上您所拥有的是:http://api.matematikfessor.dk/apps/teacher_videos

  

[{obj1},{obj2},{obj3}]

这就是为什么你的模型实例实际上是“nil”的原因,因为JSON结构与你的模型所期望的不匹配。

<强>解决方案:

如果您的JSON Feed顶部有一个数组(就像您使用的URL上的那个),您有两个选择:

1)在您的JSON提要中引入一个新密钥 - 即将JSON改为{“tutorials”:[obj1,obj2,etc ...]}

2)您可以使用其他方法来解析JSON提要。查找docs here并使用解析对象列表的静态方法:

#import "JSONModel+networking.h"
...
[JSONHTTPClient   
  getJSONFromURLWithString:@"http://api.matematikfessor.dk/apps/teacher_videos"
  completion:^(id feed, JSONModelError *err) {
    NSArray* tutorials = [Tutorial arrayOfModelsFromDictionaries: feed];
    NSLog(@"tutorials: %@", tutorials);
  }];