Mappage de json avec RestKit 0.20.3

J'essaie de mapper des objects via RestKit 0.20.3, mais je connais ces journaux depuis des jours:

2013-08-12 18:32:08.158 MyAppIphone[848:5703] E restkit.network:RKResponseMapperOperation.m:304 Failed to parse response data: Loaded an unprocessable response (200) with content type 'application/json' 2013-08-12 18:32:08.174 MyAppIphone[848:5703] E restkit.network:RKObjectRequestOperation.m:238 POST 'myUrl' (200 OK / 0 objects) [request=0.1305s mapping=0.0000s total=5.6390s]: error=Error Domain=org.restkit.RestKit.ErrorDomain Code=-1017 "Loaded an unprocessable response (200) with content type 'application/json'" UserInfo=0x1ed5a500 {NSErrorFailingURLKey=myUrl, NSUnderlyingError=0x1ed5b240 "The operation couldn't be completed. (Cocoa error 3840.)", NSLocalizedDescription=Loaded an unprocessable response (200) with content type 'application/json'} response.body={"my json content"} 

Voici la class MyData:

 #import <Foundation/Foundation.h> @interface MyData : NSObject @property (nonatomic, retain) NSSsortingng *criterias; @end 

Voici comment j'ai configuré mon mappeur:

 - (RKResponseDescriptor*) getDataMapping { // Mapping RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[MyData class]]; [mapping addAtsortingbuteMappingsFromDictionary:@{ @"criteriasHeader": @"criteriasHeader" }]; // Status code NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Descriptior return [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodPOST pathPattern:nil keyPath:@"regions" statusCodes:statusCodes]; } 

Voici ma fonction de request:

 - (void) runRequestWithType:(RequestType)type baseUrl:(NSSsortingng *)baseUrlSsortingng path:(NSSsortingng *)path parameters:(NSDictionary *)parameters mapping:(RKResponseDescriptor *) descriptor { // Print heeader and body from the request and the response RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); RKLogConfigureByName("Restkit/Network", RKLogLevelDebug); RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); RKLogConfigureByName("Restkit/ObjectMapping", RKLogLevelDebug); // Set up the base url NSURL *baseUrl = [NSURL URLWithSsortingng:baseUrlSsortingng]; //Run request in block RKObjectManager *manager = [RKObjectManager managerWithBaseURL:baseUrl]; [manager addResponseDescriptorsFromArray:@[descriptor]]; [manager.router.routeSet addRoute:[RKRoute routeWithClass:[MyData class] pathPattern:path method:RKRequestMethodPOST]]; //[manager getObjectsAtPath:path parameters:parameters success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { [manager postObject:nil path:path parameters:parameters success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { if ([self.delegate respondsToSelector:@selector(requestDidSucceedWithType:andResponse:)]) { [self.delegate requestDidSucceedWithType:type andResponse:[mappingResult firstObject]]; } } failure:^(RKObjectRequestOperation *operation, NSError *error) { if ([self.delegate respondsToSelector:@selector(requestDidFailWithError:andError:)]) { [self.delegate requestDidFailWithType:type andError:error]; } }]; } 

PS: J'ai essayé avec un JSON plus court, ça marche bien.

Est-ce que j'ai fait quelque chose de mal?

Pourriez-vous m'aider, merci.

Ce type d'erreur provient du mappage JSON sous RK. La valeur par défaut est d'utiliser NSJSONSerialization encapsulé dans RKNSJSONSerialization. Vous pouvez mettre un point d'arrêt là-bas pour en savoir plus sur l'erreur. J'ai trouvé 2 sources jusqu'à maintenant:

  • NSJSONSerialization n'aime pas datatables non UTF8. Assurez-vous de le recevoir du server, ou de modifier RK pour faire la bonne conversion de données en string (avec un enencoding correct) en données UTF8 (meilleur moyen que j'ai jusqu'ici). Si vous utilisez CoreData, vous pouvez searchr dans RKManagedObjectRequestOperation à la ligne 586.
  • dans iOS5 il y a des bugs. La solution la plus simple consiste à utiliser une autre bibliothèque d'parsing syntaxique

J'espère que vous êtes en mesure de changer le encoding du server JSON en UTF-8.

Si ce n'est pas le cas, vous pouvez résoudre ce problème en remplaçant le gestionnaire de type mime JSON par défaut dans Restkit. Utilisez la class RKNSJSONSerialization comme reference.

Dans votre gestionnaire de type mime JSON personnalisé, effectuez une conversion de données du encoding entrant (dans l'exemple ci-dessous ISO-8859-1) en UTF-8, avant de faire la même chose que la class RKNSJSONSerialization .

 @implementation MyCustomJSONSerializer + (id)objectFromData:(NSData *)data error:(NSError **)error { NSSsortingng* latin = [[NSSsortingng alloc] initWithBytes:[data bytes] length:[data length] encoding:NSISOLatin1SsortingngEncoding]; NSData* utf8 = [latin dataUsingEncoding:NSUTF8SsortingngEncoding]; return [NSJSONSerialization JSONObjectWithData:utf8 options:0 error:error]; } @end 

Vous pouvez faire la même chose pour la méthode dataFromObject si vous devez renvoyer datatables au server en encoding non-UTF-8.

Vous pouvez maintenant append ce gestionnaire personnalisé après avoir initkit Restkit, et il sera utilisé par rapport à celui par défaut (UTF-8):

 [RKMIMETypeSerialization registerClass:[MyCustomJSONSerializer class] forMIMEType:RKMIMETypeJSON];