Я использую KeyValueObjectMapping, разработанный dchohfi. Но проблема при отображении массива объектов JSON

JSON Model Library

У меня есть объект Json и соответствующие модели -

{
"type": "flight",
"senderid": "101",
"message": 
{
    "origin": "Bangalore",
    "destination": "Paris",
    "start_date": "21-04-2017",
    "end_date": "27-04-2017",
    "price": "300",
    "currency": "$",
    "fare_rules": "This is the fare rules text.",
    "refundable": "true",
    "check_in_baggage": "30 kg",
    "legs": [
        {
            "index": "1",
            "airline_id": "2003",
            "flight_number": "TK 721 T",
            "name": "Turkish Airline",
            "logo": "http://turkish.com/logo.png",
            "origin": "Bangalore",
            "destination": "Chennai",
            "start_date": "21-04-2017",
            "end_date": "21-04-2017",
            "start_time": "06.20 pm",
            "end_time": "8.15 pm",
            "journey_time": "2h 30m",
            "is_next": "true",
            "layover": "3 hours"
        },
        {
            "index": "2",
            "airline_id": "4003",
            "flight_number": "JT 021",
            "name": "Jet Airways",
            "logo": "http://jetairways.com/logo.png",
            "origin": "Chennai",
            "destination": "Paris",
            "start_date": "21-04-2017",
            "end_date": "21-04-2017",
            "start_time": "11.20 pm",
            "end_time": "2.15 am",
            "journey_time": "3h 10m",
            "is_next": "false",
            "layover": ""
        }
    ]
}
}

Код сопоставления -

DCParserConfiguration *config = [DCParserConfiguration configuration];

DCArrayMapping *mapper = [DCArrayMapping mapperForClassElements:[TRChatFlightLegModel class] forAttribute:@"legs" onClass:[TRChatFlightMessageModel class]];

[config addArrayMapper:mapper];

DCKeyValueObjectMapping *parser = [DCKeyValueObjectMapping mapperForClass:[TRChatTypeFlightsModel class] andConfiguration:config];

TRChatTypeFlightsModel *chatTextModel = [parser parseDictionary:message.data.message];

И мои классы моделей выглядят так:

@interface TRChatTypeFlightsModel : NSObject

@property (strong, nonatomic) NSString *type;
@property (assign, nonatomic) NSInteger senderid;
@property (strong, nonatomic) TRChatFlightMessageModel *message;

@end

@interface TRChatFlightMessageModel : NSObject

@property (strong, nonatomic) NSString *origin;
@property (strong, nonatomic) NSString *destination;
@property (strong, nonatomic) NSString *start_date;
@property (strong, nonatomic) NSString *end_date;
@property (strong, nonatomic) NSString *fare_rules;
@property (strong, nonatomic) NSArray *flight_legs;

@interface TRChatFlightLegModel : NSObject

@property (strong, nonatomic) NSString *index;
@property (strong, nonatomic) NSString *airline_id;
@property (strong, nonatomic) NSString *is_next;
@property (strong, nonatomic) NSString *layover;

@end

Я получаю значение для chatTextModel.message.origin, но получаю nil для chatTextModel.message.flight_legs. Какие-либо предложения?

2 ответа

Решение

Измените имя объекта класса Model "flight_legs" на "leg". Потому что здесь
JSON Model Library выполняет отображение

путь ключа json <----> путь ключа объекта.

Отсюда и перемены

@property (strong, nonatomic) NSArray *flight_legs;

в

@property (strong, nonatomic) NSArray *legs; 

Ладно, вот внутри диктат legs является dict, который содержит массив из двух элементов.

Вы можете получить JSON данные так же просто, как:

// returned string contaning JSON data
NSData *data = [returnString dataUsingEncoding:NSUTF8StringEncoding];
// json can be NSDictionary *json
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

// parsing data from main dict (JSON data)
NSDictionary *innerDict1 = [json valueForKey:@"message"];

// now parsing data from message dict
NSDictionary *innerDict2 = [innerDict1 valueForKey:@"legs"];

// parsing node of legs dict, can pass any key inside legs
NSLog(@"values: %@", [innerDict2 valueForKey:@"airline_id"]);

// getting values inside mutable array 
array1 = [innerDict2 valueForKey:@"index"];    
array2 = [innerDict2 valueForKey:@"airline_id"];
Другие вопросы по тегам