私はしばらくの間この問題に苦労してきましたが、JSON シリアライゼーションが機能しない理由がわかりません。時間がかかりすぎる単純なタスクのように見えます。
以下にリストされているモデルクラスがあります。ユーザー オブジェクトには、教育および雇用オブジェクトの NSArray があります。
私はRestKitを使用しており、すべての関係が作成されており、パラメーターの辞書が作成されていることがわかります。データは正しいです。問題をさらにデバッグするために、次のコードを使用して JSON を作成しています。
NSDictionary *parameters = [RKObjectParameterization parametersWithObject:self.user requestDescriptor:delegate.postUserRequestDescriptor error:&error];
// Serialize the object to JSON
BOOL isTurnableToJSON = [NSJSONSerialization
isValidJSONObject: parameters];
if(isTurnableToJSON){
NSData *JSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
}
isTurnableToJSON は常に「NO」です。JSON の作成を強制すると、次のエラーが発生します。
** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Education)'
Education と user の関係を削除すると、同じエラーが雇用にもスローされます。
これが私のユーザー、教育、および場所のモデルです。
@interface User : NSObject
@property (strong, nonatomic) NSString *first_name;
@property (strong, nonatomic) NSString *middle_name;
@property (strong, nonatomic) NSString *last_name;
@property (strong, nonatomic) NSString *profile_picture;
@property (strong, nonatomic) NSString *display_name;
@property (nonatomic, strong) NSArray *education;
@property (nonatomic, strong) NSArray *employment;
@property (nonatomic, strong) NSMutableArray *skills;
@property (strong, nonatomic) NSString *about_you;
@end
@interface Education : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *graduation_date;
@property (nonatomic, strong) NSString *major;
@property (nonatomic, strong) NSString *degree;
@property (nonatomic, strong) Location *location;
@property (nonatomic) NSNumber *current;
@end
@interface Location : NSObject
@property (nonatomic, strong) NSString *city;
@property (nonatomic, strong) NSString *state;
@property (nonatomic, strong) NSString *country;
@end
この時点で、私はアイデアを失っており、助けていただければ幸いです。
更新: RestKit リレーションシップ マッピング。
RKObjectMapping *locationMap = [RKObjectMapping mappingForClass:(Location.class)];
[locationMap addAttributeMappingsFromDictionary:@{@"city":@"city",@"state":@"state",@"country":@"country"}];
RKObjectMapping *educationMap = [RKObjectMapping mappingForClass:(Education.class)];
[educationMap addAttributeMappingsFromDictionary:@ { @"name":@"name",@"graduation_date":@"graduation_date",@"major":@"major", @"degree":@"degree",@"current":@"current"}];
[educationMap addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"location" toKeyPath:@"location" withMapping:locationMap]];
RKObjectMapping *employmentMap =[RKObjectMapping mappingForClass:(Employment.class)];
[employmentMap addAttributeMappingsFromDictionary:@{@"company":@"company",@"occupation":@"occupation", @"start_date":@"start_date",@"end_date":@"end_date",@"current":@"current"}];
RKObjectMapping *userPutRequestMapping = [RKObjectMapping requestMapping];
[userPutRequestMapping addAttributeMappingsFromDictionary:putUserMap];
[userPutRequestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"education" toKeyPath:@"education" withMapping:[educationMap inverseMapping]]];
[userPutRequestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"employment" toKeyPath:@"employment" withMapping:[employmentMap inverseMapping]]];
USER PUT REQUEST
[objectManager addRequestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:userPutRequestMapping
objectClass:[User class]
rootKeyPath:nil
method:RKRequestMethodPUT]];