Сопоставление ответа JSON на объект с использованием RestKit и Objective-C
-
25-10-2019 - |
Вопрос
Я относительно новичок в Objective-C и пытаюсь использовать RestKit для получения ответа JSON от веб-службы. Я успешно получил данные обратно в свое приложение, которое выглядит так, как это просмотр ответа:
{id:"1","Translation":"Test"}
Я хотел бы сопоставить этот перевод с моим объектом «перевода» в моем приложении, но попробовал несколько разных способов, но не уверен, как это достичь.
Итак, мои вопросы:
- Как я могу составить отображение этого ответа на свой объект перевода
- Правильно ли я делаю это, создавая метод для завершения этого звонка, перехитрите мой контроллер представления?
Мой объект перевода
@implementation Translation
@synthesize identifier = _identifier;
@synthesize translation = _translation;
- (NSDictionary*)elementToPropertyMappings {
return [NSDictionary dictionaryWithKeysAndObjects:
@"id", @"identifier",
@"translation", @"translation",
nil];
}
@end
Мой метод перевода
- (NSString *)performTranslation:(NSString *)translation
{
NSString *data = [[NSString alloc] initWithFormat:@"{\"SourceId\": \"%@\",\"RegionTag\": \"%@\",\"InputString\": \"%@\"}", @"1", @"Glasgow", translation];
NSString *post = data;
RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://my.url.com/Translation/Translate"]];
MyRequest.method = RKRequestMethodPOST;
MyRequest.HTTPBodyString = post;
MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];
[MyRequest send];
RKResponse *Response = [MyRequest sendSynchronously];
return Response.bodyAsString; <--- looking to map this to translation object here
}
Решение
Фрагмент вашего кода кажется немного устаревшим. Я настоятельно рекомендую прочитать самые новые Руководство по картированию объектов Чтобы использовать Restkit в полной мере, особенно часть Картирование без KVC.
Редактировать:
Чтобы разместить объект с Restkit и получить ответ, мы определяем TranslationRequest
класс, который будет держать наш запрос и Translation
Чтобы удержать наш ответ.
Во -первых, мы настроили наши RKObjectManager
и отображения (я обычно делаю это в своем приложении):
RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:kOurBaseUrl];
[manager setSerializationMIMEType:RKMIMETypeJSON];
//this is a singleton, but we keep the manager variable to avoid using [RKObjectManager sharedManager] all the time
//Here we define a mapping for the request. Note: We define it as a mapping from JSON to entity and use inverseMapping selector later.
RKObjectMapping *translationRequestMapping = [RKObjectMapping mappingForClass:[TranslationRequest class]];
[translationRequestMapping mapKeyPath:@"RegionTag" toAttribute:@"regionTag"];
...
[[manager mappingProvider] setSerializationMapping:[translationRequestMapping inverseMapping] forClass:[TranslationRequest class]];
//now we define the mapping for our response object
RKObjectMapping *translationMapping = [RKObjectMapping mappingForClass:[Translation class]];
[translationMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[translationMapping mapKeyPath:@"Translation" toAttribute:@"translation"];
[[manager mappingProvider] addObjectMapping:mapping];
//finally, we route our TranslationRequest class to a given endpoint
[[manager router] routeClass:[TranslationRequest class] toResourcePath:kMyPostEndpoint];
Этого должно быть достаточно от необходимой настройки. Мы можем позвонить в наш бэкэнд в любом месте кода (например, в любом контроллере), как это:
//we create new TranslationRequest
TranslationRequest *request = [[TranslationRequest alloc] init];
[request setRegionTag:@"Hello"];
....
//then we fetch the desired mapping to map our response with
RKObjectMapping *responseMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:class]
//and just call it. Be sure to let 'self' implement the required RKObjectManagerDelegate protocol
[[RKObjectManager sharedManager] postObject:request mapResponseWith:responseMapping delegate:self];]
Попробуйте этот подход и дайте мне знать, если вам нужна какая -либо помощь. Я не смог полностью его проверить, так как у меня нет подходящего бэкэнда, которая вернет ответы, но, судя по журналу Restkit, это должно работать.
Другие советы
Вам нужно передать возвращенную строку JSON в анализатор JSON. я использую SBJSON. Анкет Затем вы можете использовать полученный словарь для заполнения свойств вашего объекта.
Рестокит, кажется, имеют нативные объекты, которые инкапсулируют четыре разных анализатора JSON. Тем не менее, я бы посоветовал осторожности, потому что они, кажется, предполагают, что объект, проведенный верхним уровнем, всегда будет словарем.
В сторону другого, пример в вашем вопросе не является действительным JSON. Это должно выглядеть так:
{"id":"1","Translation":"Test"}