2014-05-01 28 views
1

我試圖用爲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」:真正}]}

回答

1

我想通了。 ..

我的問題是與rootKeyPath參數RKRequestDescriptor requestDescriptorWithMapping。這應該是零。

我經過在資源/動作名稱,因爲我認爲RestKit使用該知道何時使用這種請求描述符(就像爲與withPathPattern參數映射響應)。不知道爲什麼有ins't需要傳遞的東西來表示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];