Как получить простой массив строк json с помощью restkit

StackOverflow https://stackoverflow.com//questions/21002196

Вопрос

Мой вопрос является дубликатом

РестКит:как получить простой массив строк JSON?

Однако, хотя первоначальный автор нашел ответы полезными, я все еще запутался.Этот вопрос содержит две отдельные ссылки, ни одна из которых не зашла достаточно далеко, чтобы помочь мне (полному новичку в KVC и RestKit).

Одна ссылка здесь и дает этот пример кода

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Whatever class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"someAttribute"]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:nil];

Каким должен быть класс?Должно ли это быть NSString?Или это означает, что я должен создать класс-оболочку, имеющую одно свойство — NSArray *?

И что такое @"someAttribute"?Опять же, подразумевается ли это класс-оболочка, и в этом случае someAttribute будет именем свойства моего класса-оболочки, которое является NSArray *?

Другая ссылка заключается в здесь и хотя он показывает выборку из массива в «класс-оболочку», класс-оболочка имеет только один NSNumber, а не массив.Поэтому неясно, как превратить этот пример в пример, позволяющий получить весь массив.

Для справки, сервер возвращает массив строк, как и исходный вопрос:["строка1", "строка2", "строка3"].

ОБНОВЛЯТЬ

Вот код, который я пробовал.Я создал класс-оболочку.

@interface CannedResponse : NSObject

@property (strong, nonatomic) NSString * response;

@end

Вот отображение:

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[CannedResponse class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"response"]];
[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodGET pathPattern:RESPONSES_API_PATH keyPath:nil statusCodes:nil;

И я звоню getObjectsAtPathForRouteName

Я получаю массив CannedReponses как и ожидалось.Однако вместо NSString помещается в свойство ответа.я получаю RKMappingSourceObject.Сейчас RKMappingSourceObject действительно содержит правильную строку.

я буду просматривать RestKit войду в консоль, чтобы посмотреть, смогу ли я найти еще какие-нибудь подсказки.

ОБНОВЛЕНИЕ № 2

Как уже упоминалось здесь автор blakewaterters В этом примере я не делаю никаких сопоставлений и могу просто обойти использование RestKit.Проблема в том, что весь код, который я пишу на уровне сервиса, использует RestKit и я слепо следовал шаблону для всех звонков.Для этого вызова правильным ответом может быть выяснить, как получить доступ AFNetworking напрямую.

Это было полезно?

Решение

Вот лучший ответ, используя другой комментарий от Blakewaterters здесь

Не используйте RestKit для такого запроса.Используйте для этого AFNetworking.И вы можете получить доступ к AFHTTPClient следующим образом:

[RKObjectManager sharedManager].HTTPClient

Тогда код выглядит примерно так

AFHTTPClient * client = [RKObjectManager sharedManager].HTTPClient;
[client getPath:YOUR_PATH
     parameters:nil
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
            success([NSArray arrayWithArray:responseObject]);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            failure(operation.response.statusCode);
        }];

Другие советы

Оказывается, то, как я это делаю в разделе ОБНОВЛЕНИЕ, работает.

RKMappingSourceObject был отвлекающим маневром.Он реализует NSProxy и поэтому действует так же, как и NSString, которого я ожидал.

Мои предположения о том, что происходит за кулисами:RestKit создает экземпляры RKMappingSourceObject во время десериализации.Когда он понимает, что эти объекты, которые у меня есть, являются примитивами и ни с чем не сопоставляются, он просто оставляет их в объекте сопоставления, но, поскольку он реализует NSProxy, он может перенаправлять любые запросы к базовой строке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top