Ale*_*one 7 iphone json objective-c ios restkit
我正在构建一个双向Dropbox同步应用程序.我从核心数据加载对象,将它们转换为JSON并将它们发送到dropbox.但是,当我进行同步时,我将一组本地JSON文件与Dropbox JSON文件进行比较.如果检测到冲突,则应用同步逻辑.作为同步逻辑的结果,可以下载远程JSON文件并替换本地JSON文件.
所以我最终在本地文档目录中有一堆JSON文件.
如何使用RestKit使用我定义的映射将本地JSON文件反序列化为对象?RKTwitterCoreData从基于Web的JSON创建核心数据实体.我正在尝试使用本地JSON文件执行相同操作.
有一堆loadObjects方法,但所有这些方法似乎都适用于Web调用:
- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate;
Run Code Online (Sandbox Code Playgroud)
谢谢 !
这是来自Rest-Kit文档,尚未尝试过,但它看起来像是使用JSON字符串的开始.
你可以在这里找到它: 查看页面底部
NSString* JSONString = @"{ \"name\": \"The name\", \"number\": 12345}";
NSString* MIMEType = @"application/json";
NSError* error = nil;
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:MIMEType];
id parsedData = [parser objectFromString:JSONString error:&error];
if (parsedData == nil && error) {
// Parser error...
}
RKObjectMappingProvider* mappingProvider = [RKObjectManager sharedManager].mappingProvider;
RKObjectMapper* mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:mappingProvider];
RKObjectMappingResult* result = [mapper performMapping];
if (result) {
// Yay! Mapping finished successfully
}
Run Code Online (Sandbox Code Playgroud)
编辑 请参阅rob5408关于保存上下文的说明:
[[RKObjectManager sharedManager].objectStore.managedObjectContext save:&error];
Run Code Online (Sandbox Code Playgroud)
这是我用于将 Core Data 转换为 JSON 到 Core Data 的方法。
-(void)deserializeFileAtPath:(NSString*)filePath
{
DLog(@"Deserialize file: %@",filePath);
NSError* error = nil;
NSString *stringJSON = [NSString stringWithContentsOfFile:filePath usedEncoding:nil error:&error];
if(error)
{
NSLog(@"Error reading from file: %@", filePath);
}
//restore the dictionary, as it was serialized
NSDictionary* serializationDictionary = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:filePath] options:NSJSONReadingMutableContainers error:&error];
//Here you must ensure that your object mapping exists
[CoreDataWrapper setupCoreDataObjectMapping];
//top level object within JSON it will have one entity that you really want to deserialize. Without a wrapper, the mapper would not know what the top level entity really is
CoreDataWrapper* wrapper = [CoreDataWrapper object];
RKObjectMapper* mapper;
error = nil;
//this performs deserialization. if you get errors about designated initializer not being called, you have setup a wrong object mapping. You need to define RKManagedObjectMapping for your core data classes
mapper = [RKObjectMapper mapperWithObject:serializationDictionary
mappingProvider:[RKObjectManager sharedManager].mappingProvider];
RKObjectMappingResult* result = [mapper performMapping];
//top level object within wrapper that holds the real payload
RealCoreDataEntity* realCoreData = [result asObject];
realCoreData.wrapper = wrapper;
//just in case
[[wrapper managedObjectContext]save:nil];
//prints what we got back
DLog(@"%@", realCoreData);
//prints any nested relationships
for(NestedRelationshipObject* relationshipEntity in realCoreData.relationship)
{
DLog(@"Nested entity:%@", relationshipEntity);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何定义嵌套的 RestKit 对象模型。当这种结构的 JSON 文件被反序列化时,它会自动为您创建所有嵌套关系,甚至合并托管对象上下文!
+(void)setupCoreDataObjectMapping
{
RKObjectManager *objectManager = [RKObjectManager sharedManager ] ;
// Setup our object mappings
/*!
Mapping by entity. Here we are configuring a mapping by targetting a Core Data entity with a specific
name. This allows us to map back Twitter user objects directly onto NSManagedObject instances --
there is no backing model class!
*/
//********************************
RKManagedObjectMapping* nestedRelationshipMapping = [RKManagedObjectMapping mappingForEntityWithName:@"NestedRelationshipObject"];
//UUID determines which objects get updated and which ones get created during the mapping process
nestedRelationshipMapping.primaryKeyAttribute = @"uuid";
[nestedRelationshipMapping mapKeyPathsToAttributes:
@"IKeepTheseTheSame", @"IKeepTheseTheSame",
@"AnotherValue",@"AnotherValue",
//keep adding your attributes
nil];
[objectManager.mappingProvider addObjectMapping:nestedRelationshipMapping];
//********************************
RKManagedObjectMapping* mainPayloadMapping = [RKManagedObjectMapping mappingForEntityWithName:@"RealCoreDataEntity"];
mainPayloadMapping.primaryKeyAttribute = @"uuid";
[mainPayloadMapping mapKeyPathsToAttributes:
@"companyName",@"companyName",
//keep adding your attributes
nil];
//this is the main payload. I create all of it's relationships before, and then add them to the mapping.
[mainPayloadMapping mapRelationship:@"relationshipName" withMapping:nestedRelationshipMapping];
[objectManager.mappingProvider addObjectMapping:mainPayloadMapping];
[objectManager.mappingProvider setSerializationMapping:[mainPayloadMapping inverseMapping] forClass:[YourNSManagedObjectSubclass class]];
[objectManager.mappingProvider setMapping:nestedRelationshipMapping forKeyPath:@"mainPayloadToNestedDataRelationshipName"];
[objectManager.mappingProvider setMapping:mainPayloadMapping forKeyPath:@"wrapperToMainPayloadRelationshipName"];
//this is a top level JSON object. It's name will not be identified within the object, but it's relationshipName will be. The result of deserializing this object would be an object that is being wrapped.
RKManagedObjectMapping* wrapperMapping = [RKManagedObjectMapping mappingForClass:[IconFileWrapper class]];
iconWrapperMapping.primaryKeyAttribute = @"uuid";
// keyPath and attribute names. must be even
[iconWrapperMapping mapKeyPathsToAttributes:@"uuid",@"uuid",nil];
//keep adding your attributes
[iconWrapperMapping mapRelationship:@"relationshipName" withMapping:mainPayloadMapping];
[objectManager.mappingProvider addObjectMapping:wrapperMapping];
[objectManager.mappingProvider setSerializationMapping:[wrapperMapping inverseMapping] forClass:[YourWrapperNSManagedObjectSubclass class]];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4368 次 |
| 最近记录: |