我正在使用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
我不确定我做错了什么。 有人有任何线索吗?
答案 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);
}];