ios - 如何修复 RestKit JSON 序列化问题

标签 ios objective-c json restkit restkit-0.20

我正在尝试使用 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 Starting mapping operation... 2014-05-01 10:17:39.287 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:953 Performing mapping operation: for '__NSDictionaryM' object. Mapping values from object ((null)) to object { } with object mapping (null) 2014-05-01 10:17:39.287 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'Code' to 'Code' 2014-05-01 10:17:39.287 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Code' to 'Code'. Value: XXXX98765 2014-05-01 10:17:39.287 Flightdocs[2447:12ef7] D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class '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 Mapping attribute value keyPath 'Id' to 'Id' 2014-05-01 10:17:39.288 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Id' to 'Id'. Value: 25699 2014-05-01 10:17:39.288 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'Latitude' to 'Latitude' 2014-05-01 10:17:39.288 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Latitude' to 'Latitude'. Value: 0 2014-05-01 10:17:39.288 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'Location' to 'Location' 2014-05-01 10:17:39.288 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Location' to 'Location'. Value: Nowhere, FL 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'Longitude' to 'Longitude' 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Longitude' to 'Longitude'. Value: 0 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'Name' to 'Name' 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'Name' to 'Name'. Value: TEST Customer Airport 2 created by tstUser 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'TimeZone' to 'TimeZone' 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'TimeZone' to 'TimeZone'. Value: :America/New York 2014-05-01 10:17:39.289 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'IsUserDefinedAirportCode' to 'IsUserDefinedAirportCode' 2014-05-01 10:17:39.290 Flightdocs[2447:60b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'IsUserDefinedAirportCode' to 'IsUserDefinedAirportCode'. Value: 1 2014-05-01 10:17:39.290 Flightdocs[2447:60b] D restkit.network:RKObjectParameterization.m:128 Serialized __NSCFBoolean value at keyPath to __NSCFBoolean (1) 2014-05-01 10:17:39.290 Flightdocs[2447:60b] D restkit.object_mapping:RKMappingOperation.m:1021 Finished mapping operation successfully... 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"; Authorization = "Bearer 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":"Nowhere, FL","Name":"TEST Customer Airport 2 created by tstUser","TimeZone":":America/New York","Longitude":0,"Code":"XXXX98765","IsUserDefinedAirportCode":true}]}

最佳答案

我想通了...

我的问题是 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];

关于ios - 如何修复 RestKit JSON 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23409641/

相关文章:

android - 如何在混合应用程序上优化静态 Assets

ios - 颜色作为 slider 位置的函数,用于设置颜色

ios - 当前模态未正确调整 View 大小

ios - 如何将 uitableviewcell 数据填充到其他类?

ios - App在ios中的本地化错误

objective-c - xcode相机检查模拟器

ios - backtrace 错过导致崩溃的函数

javascript - Angularjs、嵌套 JSON 和 ng-repeat

javascript - 在 Nodejs 中使用 web worker 运行多个任务

Python:如何将列表字典转换为 JSON 对象?