我试图用为POST JSON对象(有时数组只包含一个对象)一个REST服务的阵列RestKit 0.2如何解决RestKit JSON序列化问题
我想被发送到服务应该是这个样子的阵列与一个对象:
{[
{
"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映射属性 value keyPath'Code'to'Code'2014-05-01 10:17:39.287 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 将属性值从keyPath'Code'映射到'Code' 。值:XXXX98765 2014-05-01 10:17:39.287 Flightdocs [2447:12ef7] d restkit.object_mapping:RKPropertyInspector.m:130缓存属性 为类 '的NSMutableDictionary' 检查:{ fileHFSFlags = { isPrimitive = 1 ; keyValueCodingClass = NSNumber; name = fileHFSFlags; }; fileHFSResourceForkSize = { isPrimitive = 1; keyValueCodingClass = NSNumber; name = 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映射属性 value keyPath'Latitude'to'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映射属性 value keyPath'Location'to'Location'2014-05-01 10: 17:39.288 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 将keyPath'Location'的属性值映射到'Location'。 Value: Nowhere,FL 2014-05-01 10:17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:550映射属性 value keyPath'Longitude'to'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映射属性 value keyPath'Name'to'Name'2014-05-01 10: 17:39.289 Flightdocs [2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 将keyPath'Name'的属性值映射到'Name'。价值:TEST 客户机场2由tstUser创建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'。值::美国/纽约 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序列化 在的keyPath __NSCFBoolean值__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”; q = 0.8,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”=“application/json; charset = utf-8”; “User-Agent”=“Flightdocs/1.4.7(iPad Simulator; iOS 7.1; Scale/1.00)”; } request.body = {“/ AirportCode/UpsertCustomerAirportCodes”:[{“Id”:25699,“Latitude”:0,“Location”:“无处, FL”,“Name”:“TEST Customer Airport 2 created by tstUser”, “时区”: “:美国/新 纽约”, “经度”:0, “守则”: “XXXX98765”, “IsUserDefinedAirportCode”:真正}]}