2

JSONModel を使用して、URL から JSON を取得しています。これは、"name" と "url" の 2 つの文字列のみを含む、非常に単純なオブジェクトです。

まず、オブジェクト モデルを作成しました。

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

次に、オブジェクト フィード:

#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

このチュートリアルに従って、すべて完了しました

何が間違っているのかわかりません。誰にも手がかりはありますか?

4

1 に答える 1

6

説明:

まず、JSONModel は、JSON のトップ オブジェクトが辞書であることを期待します。その方法でのみ、そのキーをモデルのプロパティに一致させることができます。

TutorialFeed というモデルは、プロパティ名「tutorials」に一致する JSON が供給されることを想定しています。これは、JSON フィードが次の形式である必要があることを意味します。

{ "チュートリアル": [{obj1}, {obj2}, {obj3}, ...] }

実際に持っているもの: http://api.matematikfessor.dk/apps/teacher_videos

[{obj1}、{obj2}、{obj3}]

JSON構造がモデルが期待するものと一致しなかったため、モデルインスタンスが実際には「nil」であるのはそのためです。

解決:

JSON フィード (使用する URL の配列など) の上部に配列がある場合、次の 2 つのオプションがあります。

1) JSON フィードに新しいキーを導入します。つまり、JSON を {"tutorials": [obj1, obj2, etc...]} の形式に変更します。

2) 別の方法を使用して JSON フィードを解析できます。こちらのドキュメントを参照して、オブジェクトのリストを解析する静的メソッドを使用してください。

#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);
  }];
于 2013-09-19T18:50:03.163 に答える