Отображение ответа JSON на объект с использованием RestKit и Objective-C - PullRequest
0 голосов
/ 29 ноября 2011

Я относительно новичок в Objective-C и пытаюсь использовать RestKit для получения ответа JSON от веб-службы. Я успешно получил данные обратно в свое приложение, которое выглядит следующим образом при просмотре ответа:

{id:"1","Translation":"Test"}

Я хотел бы отобразить этот перевод на мой объект "Перевод" в моем приложении, но попробовал несколько разных способов, но не уверен, как этого добиться.

Итак, мои вопросы:

  1. Как мне сопоставить этот ответ с моим объектом перевода
  2. Правильно ли я делаю это, создавая метод для завершения этого вызова, обхитрив мой контроллер представления?

Мой объект перевода

@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

}

Ответы [ 2 ]

4 голосов
/ 29 ноября 2011

Фрагмент вашего кода выглядит немного устаревшим. Я настоятельно рекомендую прочитать новейшее руководство Object Mapping , чтобы максимально использовать RestKit - особенно его часть Mapping без KVC .

Edit:

Чтобы опубликовать объект с помощью RestKit и получить ответ, мы определяем класс TranslationRequest, который будет содержать наш запрос, и Translation для хранения нашего ответа.

Во-первых, мы настраиваем наши RKObjectManager и сопоставления (я обычно делаю это в моем AppDelegate):

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, это должно сработать.

3 голосов
/ 29 ноября 2011

Вам нужно передать возвращенную строку JSON в анализатор JSON. Я использую SBJSON . Затем вы можете использовать полученный словарь для заполнения свойств вашего объекта.

RestKit, похоже, содержит нативные объекты, которые инкапсулируют четыре различных анализатора JSON. Однако я бы посоветовал быть осторожным, потому что они, похоже, предполагают, что анализируемый объект верхнего уровня всегда будет словарем.

Как еще один пример, пример в вашем вопросе не является допустимым JSON. Это должно выглядеть так:

{"id":"1","Translation":"Test"}
...