我正在为我的一个项目使用RestKit框架。它包含一个如何使用对象映射将JSON对象转换为核心数据图的示例。如果反过来可以徘徊 - 可以将使用RestKit的Core Data实体转换回JSON表示吗?
我发现了RKObjectSerializer
类,但我似乎无法使它工作 - 我得到的序列化对象是nil
-(void)doCoreDataToJSONConversion
{
Article* article = [_articles objectAtIndex:0];
RKManagedObjectMapping* articleMapping = [RKManagedObjectMapping mappingForClass:[Article class]];
NSAssert(articleMapping!=nil,@"article mapping is nil!");
NSLog(@"%@",[article description]);
RKObjectSerializer* serializer =[RKObjectSerializer serializerWithObject:article mapping:articleMapping];
NSError* error = nil;
NSMutableDictionary* serializedObject = [serializer serializedObject:&error];
if(error!=nil)
{
NSLog(@"!!!!! Error: %@",[error localizedDescription]);
}
//prints nil
NSLog(@"Serialized Object: %@", [serializedObject description]);
}
感谢您的投入!
答案 0 :(得分:1)
无法准确地告诉你关于RestKit的信息,但如果你只是看看Marcus Zarra的这个绝对精彩的答案,你可以很容易地将你所有的核心数据图转换成JSON并返回
答案 1 :(得分:1)
我最终使用这些方法将核心数据对象转换为JSON。要反序列化这些对象,我需要定义一个不同的映射类:RKManagedObjectMapping,它与常规对象映射略有不同。
-(void)setupObjectSerializationMapping
{
RKObjectManager *objectManager = [RKObjectManager sharedManager ] ;
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Article class]];
[mapping mapAttributes:@"articleID", @"title", @"body", nil];
//********************************
RKObjectMapping *imageMapping = [RKObjectMapping mappingForClass:[EventImage class]];
[imageMapping mapAttributes:@"createDate", @"localFilePath", nil];
[objectManager.mappingProvider addObjectMapping:imageMapping];
[objectManager.mappingProvider setSerializationMapping:[imageMapping inverseMapping] forClass:[EventImage class]];
[objectManager.mappingProvider setMapping:imageMapping forKeyPath:@"eventImages"];
//********************************
RKObjectMapping *eventMapping = [RKObjectMapping mappingForClass:[Event class]];
[eventMapping mapAttributes:@"createDate", @"note", nil];
[eventMapping mapRelationship:@"eventImages" withMapping:imageMapping];
[objectManager.mappingProvider addObjectMapping:eventMapping];
[objectManager.mappingProvider setSerializationMapping:[eventMapping inverseMapping] forClass:[Event class]];
[objectManager.mappingProvider setMapping:eventMapping forKeyPath:@"events"];
//********************************
//setup App user mapping
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[AppUserSubclass class]];
[userMapping mapAttributes:@"userID",@"firstName", @"lastName",@"localDataFilepath", nil];
[userMapping mapRelationship:@"events" withMapping:eventMapping];
[objectManager.mappingProvider addObjectMapping:userMapping];
[objectManager.mappingProvider setSerializationMapping:[userMapping inverseMapping] forClass:[AppUserSubclass class]];
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"appUser"];
}
-(NSString*)generateLocalJSONData
{
NSString* folderPath = [self dataFolderPath];
// remember what the file was called. This will not include the documents directory and will be the same on all machines.
NSString* localFileName = [self fileName];
NSString* dataFile = [self fullDocumentsFilePath];
self.localDataFilepath = dataFile;
NSAssert(self.localDataFilepath!=nil,@"failed to save local data path");
//********************************
NSError* error = nil;
//app user subclass is the same as AppUser, but is used to differentiate between file based mapping and core data mapping
RKObjectMapping *serMap = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[AppUserSubclass class]];
NSDictionary *d = [[RKObjectSerializer serializerWithObject:self mapping:serMap] serializedObject:&error];
if(error!=nil)
{
NSLog(@"!!!!! Error: %@",[error localizedDescription]);
}
NSString* dataContents = [d JSONString];
BOOL success = [dataContents writeToFile:dataFile atomically:YES encoding:NSUTF8StringEncoding error:nil];
if(!success)
{
NSLog(@"Error writing to data file!");
}
[[AppUser managedObjectContext] save:nil];
return dataFile;
}