0

私はしばらくの間この問題に苦労してきましたが、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]];
4

0 に答える 0