0

JSONModelを使用してモデル クラスを作成しようとしています。使用後の json DictionaryNSJSONSerializationは以下のようになります。

      {
apiStatus =     {
    message = SUCCESS;
    success = 1;
};
boardingPoints = "<null>";
inventoryType = 0;
seats =     (
            {
        ac = 0;
        available = 1;
        bookedBy = "<null>";
        commission = "<null>";
        fare = 1200;


    },
            {
        ac = 0;
        available = 1;
        bookedBy = "<null>";
        commission = "<null>";
        fare = 1200;


    },

  );
}

JSON は次のようになります。

   {"boardingPoints":null,"inventoryType":0,"apiStatus":{"success":true,"message":"‌​SUCCESS"},"seats":[{"fare":1200,"commission":null,"bookedBy":null,"ac":false,"ava‌​ilable":true},{"fare":1200,"commission":null,"bookedBy":null,"ac":false,"availabl‌​e":true},]}

私はこのようなモデルクラスを持っています:-

 @interface Seat : JSONModel

 @property (nonatomic,strong)NSString *ac;
 @property (nonatomic,strong)NSString *available;
 @property(nonatomic,strong)NSString *bookedBy;
 @property(nonatomic,strong)NSString *comission;
 @property(nonatomic)NSNumber * fare;

キーのマッピングについては、次のようにしました:-

 +(JSONKeyMapper*)keyMapper {
return [[JSONKeyMapper alloc] initWithDictionary:@{@"ac":@"ac",
                                                   @"available":@"available",
                                                   @"bookedBy":@"bookedBy",
                                                   @"commission":@"commission",
                                                   @"fare":@"fare", }];

}

ただし、このモデルを使用しようとすると、次のエラーが発生します。

[JSONModel.m:252] Incoming data was invalid [Seat initWithDictionary:]. Keys missing: {(
bookedBy,
comission,
available,
ac,
fare,

)}

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'

私はこのように使用しています:

 //Using JSON Model.
    NSError *jsonError;
    seat = [[Seat alloc]initWithDictionary:jsonDictionary error:&jsonError];
    jsonArray = @[seat.ac,seat.available,seat.bookedBy,seat.comission,seat.fare];
    NSLog(@"JSON Model Array : %@", jsonArray);

正しい使い方は?

4

2 に答える 2

2

まず第一に+(JSONKeyMapper*)keyMapper、プロパティ名がフィールド名と一致する場合はオーバーライドする必要はありません。null になる可能性のあるフィールドには、オプションのキーワードを入れてみてください。

@interface Seat : JSONModel

@protocol Seat;

@property (nonatomic,strong)NSString *ac;
@property (nonatomic,strong)NSString<Optional> *available;
@property(nonatomic,strong)NSString<Optional> *bookedBy;
@property(nonatomic,strong)NSString *comission;
@property(nonatomic)NSNumber * fare;

@end

これをさらに一歩進めて、次のように最上位クラスでカスケードを行うことができます。

//Result.h
#import "Seat.h"
#import "APIStatus.h"
@interface Result: JSONModel

@property(nonatomic,strong) APIStatus *apiStatus;
@property(nonatomic,strong) NSString<Optional> *boardingPoints;
@property(nonatomic,strong) NSArray<Seat> *seats;
@property(nonatomic,strong) NSNumber *boardingPoints;

@end

//APIStatus.h
@interface APIStatus: JSONModel

@property(nonatomic,strong) NSString *message;
@property(nonatomic,strong) NSNumber *success;

@end

EDIT : この方法では、結果モデルを JSONModel で初期化するだけで済み、すべての中間クラスが自動的に作成されます。プロパティの種類をいじる必要があるかもしれません。参照が必要な場合は、JSONModel の github ページに十分な説明があります。

于 2014-08-12T11:08:48.823 に答える