首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iPhone上的JSON和核心数据

iPhone上的JSON和核心数据
EN

Stack Overflow用户
提问于 2010-03-02 18:10:24
回答 8查看 41.1K关注 0票数 94

我有一个核心数据对象图(由通过一对多关系链接的两个实体组成)。

作为一名相对缺乏经验的iPhone开发人员,我很好奇是否有人能为iPhone推荐一种方法和合适的JSON实现,这将使我能够:

  1. 将核心数据记录转换为JSON字符串(同时保持实体之间的关系);
  2. 将JSON字符串转换回核心数据对象(同样保留实体之间的关系)。

我已经在这一点上搜索了一个教程/代码样本,但没有成功,因此如果有任何帮助,我们将不胜感激。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-03-02 22:55:40

首先,选择一个JSON库来使用,我个人喜欢TouchJSON,但其他几个也很不错。虽然不是很难,但复杂的部分是将托管对象转换为适合转换的结构。我写得很快,所以可能会有一两个错误:)

您调用的方法是:

代码语言:javascript
复制
- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects;
- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc;

具体实现如下:

代码语言:javascript
复制
- (NSDictionary*)dataStructureFromManagedObject:(NSManagedObject*)managedObject
{
  NSDictionary *attributesByName = [[managedObject entity] attributesByName];
  NSDictionary *relationshipsByName = [[managedObject entity] relationshipsByName];
  NSMutableDictionary *valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];
  [valuesDictionary setObject:[[managedObject entity] name] forKey:@"ManagedObjectName"];
  for (NSString *relationshipName in [relationshipsByName allKeys]) {
    NSRelationshipDescription *description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];
    if (![description isToMany]) {
      NSManagedObject *relationshipObject = [managedObject valueForKey:relationshipName];
      [valuesDictionary setObject:[self dataStructureForManagedObject:relationshipObject] forKey:relationshipName];
      continue;
    }
    NSSet *relationshipObjects = [managedObject objectForKey:relationshipName];
    NSMutableArray *relationshipArray = [[NSMutableArray alloc] init];
    for (NSManagedObject *relationshipObject in relationshipObjects) {
      [relationshipArray addObject:[self dataStructureForManagedObject:relationshipObject]];
    }
    [valuesDictionary setObject:relationshipArray forKey:relationshipName];
  }
  return [valuesDictionary autorelease];
}

- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects
{
  NSMutableArray *dataArray = [[NSMutableArray alloc] init];
  for (NSManagedObject *managedObject in managedObjects) {
    [dataArray addObject:[self dataStructureForManagedObject:managedObject]];
  }
  return [dataArray autorelease];
}

- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects
{
  NSArray *objectsArray = [self dataStructuresFromManagedObjects:managedObjects];
  NSString *jsonString = [[CJSONSerializer serializer] serializeArray:objectsArray];
  return jsonString;
}

- (NSManagedObject*)managedObjectFromStructure:(NSDictionary*)structureDictionary withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSString *objectName = [structureDictionary objectForKey:@"ManagedObjectName"];
  NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:objectName inManagedObjectContext:moc];
  [managedObject setValuesForKeysWithDictionary:structureDictionary];

  for (NSString *relationshipName in [[[managedObject entity] relationshipsByName] allKeys]) {
    NSRelationshipDescription *description = [relationshipsByName objectForKey:relationshipName];
    if (![description isToMany]) {
      NSDictionary *childStructureDictionary = [structureDictionary objectForKey:relationshipName];
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [managedObject setObject:childObject forKey:relationshipName];
      continue;
    }
    NSMutableSet *relationshipSet = [managedObject mutableSetForKey:relationshipName];
    NSArray *relationshipArray = [structureDictionary objectForKey:relationshipName];
    for (NSDictionary *childStructureDictionary in relationshipArray) {
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [relationshipSet addObject:childObject];
    }
  }
  return managedObject;
}

- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSError *error = nil;
  NSArray *structureArray = [[CJSONDeserializer deserializer] deserializeAsArray:json error:&error];
  NSAssert2(error == nil, @"Failed to deserialize\n%@\n%@", [error localizedDescription], json);
  NSMutableArray *objectArray = [[NSMutableArray alloc] init];
  for (NSDictionary *structureDictionary in structureArray) {
    [objectArray addObject:[self managedObjectFromStructure:structureDictionary withManagedObjectContext:moc]];
  }
  return [objectArray autorelease];
}

现在,这是递归的,所以如果你不小心,你可以很容易地转换你的整个持久化存储。注意你的关系,并确保它们只在对象树中“向下”移动,这样你才能得到你想要翻译的对象。

票数 103
EN

Stack Overflow用户

发布于 2010-07-19 20:14:09

我只想指出一个小的打字错误,导致代码崩溃,希望这能节省你几分钟的时间。

代码语言:javascript
复制
- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects {

    NSMutableArray *dataArray = [[NSArray alloc] init];
    for (NSManagedObject *managedObject in managedObjects) {
        [dataArray addObject:[self dataStructureFromManagedObject:managedObject]];
    }
    return [dataArray autorelease];
}

The NSMutableArray *dataArray = [[NSArray alloc] init]; // This should be NSMutableArray

真的应该是NSMutableArray *dataArray = [[NSMutableArray alloc] init];

这就是全部。

谢谢

票数 12
EN

Stack Overflow用户

发布于 2010-07-08 04:05:08

Synchronizing Core Data with Rails是一个详细的演示文稿,其中包括将核心数据对象序列化/反序列化到JSON或从JSON反序列化的示例代码(跳到核心数据部分的幻灯片55 )。他的示例代码假设了一个没有关系的相当简单的模型,尽管我认为它很容易扩展。

该演示文稿还详细介绍了如何使核心数据模型与基于REST的web应用程序保持同步,并提供了一些有用的库的指针,包括ObjectiveResourceASIHTTPRequest。我不确定这是否是你想要做的,但即使是核心数据代码也值得一看。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2362323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档