如何解决RestKit JSON序列化问题

健斗

我正在尝试使用RestKit 0.2将json对象数组(有时该数组仅包含一个对象)发布到REST服务

对于具有一个对象的数组,我想要发送到服务的内容应类似于以下内容:

{[
      {
         "Latitude":0,
         "Location":"Nowhere, FL",
         "Id":25699,
         "Version":0,
         "Name":"TEST Customer Airport 2 created by tstUser",
         "TimeZone":":America\/New York",
         "Longitude":0,
         "Code":"XXXX987",
         "IsUserDefinedAirportCode":true
      }
]}

这是RestKit根据跟踪输出在request.body中发送的内容:

{
   "\/AirportCode\/UpsertCustomerAirportCodes":[
      {
         "Latitude":0,
         "Location":"Nowhere, FL",
         "Id":25699,
         "Version":0,
         "Name":"TEST Customer Airport 2 created by tstUser",
         "TimeZone":":America\/New York",
         "Longitude":0,
         "Code":"XXXX987",
         "IsUserDefinedAirportCode":true
      }
   ]
}

json的第一个元素是我正在调用的服务的资源/操作路径。为什么RestKit会将其放入Json?

细节...

要发送此消息,我有一个ApiAirportCode模型对象:

#import <Foundation/Foundation.h>

@interface ApiAirportCode : NSObject <NSCoding>

@property (nonatomic, copy) NSString *Code;
@property (nonatomic, copy) NSNumber *Id;
@property (nonatomic, copy) NSNumber *Latitude;
@property (nonatomic, copy) NSString *Location;
@property (nonatomic, copy) NSNumber *Longitude;
@property (nonatomic, copy) NSString *Name;
@property (nonatomic, copy) NSString *TimeZone;
@property (nonatomic, assign) bool IsUserDefinedAirportCode;

@end

这是映射:

RKObjectMapping* airportCodePostMap = [RKObjectMapping mappingForClass:[ApiAirportCode class]];
[airportCodePostMap addAttributeMappingsFromArray:@[@"Code", @"Id", @"Latitude", @"Location", @"Longitude", @"Name", @"TimeZone", @"IsUserDefinedAirportCode"]];
RKRequestDescriptor* airportCodePostReqDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[airportCodePostMap inverseMapping] objectClass:[ApiAirportCode class] rootKeyPath:@"/AirportCode/UpsertCustomerAirportCodes" method:RKRequestMethodPOST];
[_ObjectManager addRequestDescriptor:airportCodePostReqDescriptor];

这是该服务的电话:

- (void) saveCustomAirportCodesToServer:(NSArray*) customAirports
{
    _ObjectManager.requestSerializationMIMEType=RKMIMETypeJSON;
    [_ObjectManager postObject:customAirports path:@"/AirportCode/UpsertCustomerAirportCodes" parameters:NULL success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        // Do something


    } failure:^(RKObjectRequestOperation *operation, NSError *error) {

        ApiPayload* errorPld = [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey][0];

    }];

    // Do something...
}

这是RestKit的跟踪输出:

2014-05-01 10:17:39.286 Flightdocs [2447:60b] D restkit.object_mapping:RKMappingOperation.m:952开始映射操作... 2014-05-01 10:17:39.287 Flightdocs [2447:60b] T restkit .object_mapping:RKMappingOperation.m:953对'__NSDictionaryM'对象执行映射操作:使用对象映射(null)将值从对象((null))映射到对象{} 2014-05-01 10:17:39.287 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'代码”到“代码” 2014-05-01 10:17:39.287 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath“代码”映射到“代码”。值:XXXX98765 2014-05-01 10:17:39.287 Flightdocs [2447:12ef7] D restkit.object_mapping:RKPropertyInspector.m:130类'的缓存属性检查 NSMutableDictionary':{fileHFSFlags = {isPrimitive = 1; keyValueCodingClass = NSNumber; 名称= fileHFSFlags; }; fileHFSResourceForkSize = {isPrimitive = 1; keyValueCodingClass = NSNumber; 名称= fileHFSResourceForkSize; }; } 2014-05-01 10:17:39.287 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'Id'到'Id'2014-05-01 10:17:39.288 Flightdocs [ 2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'Id'映射到'Id'。值:25699 2014-05-01 10:17:39.288 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'Latitude'到'Latitude'2014-05-01 10:17:39.288 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'Latitude'映射到'Latitude'。值:0 2014-05-01 10:17:39.288 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'Location'到'Location'2014-05-01 10:17:39.288 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'Location'映射到'Location'。值:无处,佛罗里达州2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'Longitude'到'Longitude'2014-05-01 10:17 :39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'Longitude'映射到'Longitude'。价值:0 2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit。object_mapping:RKMappingOperation.m:550将属性值keyPath'名称'映射到'名称'2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572从keyPath中映射属性值名称”到“名称”。值:tstUser创建的TEST Customer Airport 2创建于2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性值keyPath'TimeZone'到'TimeZone'2014-05- 01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'TimeZone'映射到'TimeZone'。值::America / New York 2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550将属性值keyPath'IsUserDefinedAirportCode'映射为' IsUserDefinedAirportCode'2014-05-01 10:17:39.290 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572将属性值从keyPath'IsUserDefinedAirportCode'映射到'IsUserDefinedAirportCode'。值:1 2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.network:RKObjectParameterization.m:128 __NSCFBoolean的keyPath上的序列化__NSCFBoolean值(1)2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.object_mapping:RKMappingOperation.m:1021成功完成了映射操作... 2014-05-01 10:17:39.294 Flightdocs [2447:60b] T restkit.network:RKObjectRequestOperation.m:178 POST' IsUserDefinedAirportCode”。值:1 2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.network:RKObjectParameterization.m:128 __NSCFBoolean的keyPath上的序列化__NSCFBoolean值(1)2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.object_mapping:RKMappingOperation.m:1021成功完成了映射操作... 2014-05-01 10:17:39.294 Flightdocs [2447:60b] T restkit.network:RKObjectRequestOperation.m:178 POST' IsUserDefinedAirportCode”。值:1 2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.network:RKObjectParameterization.m:128 __NSCFBoolean的keyPath上的序列化__NSCFBoolean值(1)2014-05-01 10:17:39.290 Flightdocs [2447:60b] D restkit.object_mapping:RKMappingOperation.m:1021成功完成了映射操作... 2014-05-01 10:17:39.294 Flightdocs [2447:60b] T restkit.network:RKObjectRequestOperation.m:178 POST'https://rsw-dev-05.flightdocs.com/AirportCode/UpsertCustomerAirportCodes':request.headers = {Accept =“ application / json”; “ Accept-Language” =“ en; q = 1,fr; q = 0.9,de; q = 0.8,zh-Hans; q = 0.7,zh-Hant; q = 0.6,ja; q = 0.5”;授权= “承载1QgmbgUMk5Z-g5W8BtDZjOIok_NIAVuaL9b6kJJybdObQv3MZVShxWS098L1M1iP7DcGsV2nYfIK-FE6409hPN8WVQAJdNwh1VKRCY0STTKpViKown53Mq0B5cl-EbgIhBOF0LvTf0xwQnsLBAOl-21QYmZyNzfEbXGNhNuX3Cn06oHdZIzxLvpvwTATnVG-hCTQvAl04Oh3wzKWu3UAt7Nnbe_pZDIhLCpPFwyIw3aI2ife5fbWpoEcRBGbU0Bob8o2vrCciQiLWPCqsN2sepztD6A1XIPWObPhgn2sBGyrgSaJN_MyG6141UAKGBTDyYPWVMIVA6wx-AFtc6116goKtHc-FV7COJl_TuAWw7itc-543Rgmu_m1jKmRQT78bzit1JxG_j0YsJ4nB2hVHdUstV3QKAGiPUQl9PJxBRyHiUhwkRFwxIEAtSk9NsjfeehJJjaEq9Dr3jkfh6S8M6-AUa88q8DxNE-xman84dUsqeBBVigoVP-PGkgqv8fkU3DE2M4vVYdlyAHGvR8okA”; “ Content-Type” =“应用程序/ json; charset = utf-8”; “ User-Agent” =“

健斗

我想到了...

我的问题是RKRequestDescriptor requestDescriptorWithMapping的rootKeyPath参数。这应该为零。

我传入资源/操作名称是因为我认为RestKit使用此名称来知道何时使用此请求描述符(就像使用withPathPattern参数映射响应一样)。不知道为什么不需要传递某些内容来指示withPathPattern。

所以这行代码:

RKRequestDescriptor* airportCodePostReqDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[airportCodePostMap inverseMapping] objectClass:[ApiAirportCode class] rootKeyPath:@"/AirportCode/UpsertCustomerAirportCodes" method:RKRequestMethodPOST];

应该

RKRequestDescriptor* airportCodePostReqDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[airportCodePostMap inverseMapping] objectClass:[ApiAirportCode class] rootKeyPath:nil method:RKRequestMethodPOST];

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章