Как получить простой массив строк json с помощью restkit
-
20-12-2019 - |
Вопрос
Мой вопрос является дубликатом
РестКит:как получить простой массив строк 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, он может перенаправлять любые запросы к базовой строке.