2

我正在解析一些以这种格式出现的 JSON:

{
dataId = "823o7tr23d387g";
category = "link";
details = {
    text = "Some text associated with the link";
    url = "http://www.url.com";
    thumbnail_url = "http://www.url.com/picture.jpeg";
};
source = "CNN";
},
{
...
},

MagicalRecord 有一个很好的导入方法:+ (id) importFromObject:(id)data;但它是否支持 JSON 字典中的字典,以便它可以自动映射details {}到适当的属性?

是否有命名约定或我需要使用的东西?

4

2 回答 2

5

查看这篇关于使用 MagicalRecord 自动导入 JSON 的文章,特别是数据 keypath 支持部分

http://www.cimgf.com/2012/05/29/importing-data-made-easy/

数据密钥路径支持

键值编码是Objective C 中一种常用且有效的工具。MagicalImport 允许您将keyPaths 指定为mappedKeyName 的一部分,从而使您可以访问其中的一些功能。如果您熟悉 KVC,这应该是一个相当简单的功能,因为 Magicalmport 将这些指定的密钥传递给了 KVC 方法。Keypath 支持允许您将数据映射到可能与数据模型不具有完全相同层次结构的实体。例如,一个数据实体可能存储纬度和经度,但源数据看起来更像这样:

{
  "name": "Point Of Origin",
  "location":
  {
    "latitude": 0.00,
    "longitude": 0.00
  }
}

在这种情况下,我们可以在 mappedKeyName 配置中将 location.latitude 和 location.longitude 指定为我们的数据导入键路径,以深入挖掘嵌套数据结构并将这些值专门导入我们的核心数据实体。

于 2012-08-21T14:52:21.720 回答
2

Scott 提到的博客对于使用 MagicalRecord 的人来说是必读的。

此外,如果默认值+ (id) importFromObject:(id)data不适用于您的某些 NSDictionary 数据,您始终可以覆盖- (BOOL) importValuesForKeysWithObject:(id)objectDataNSManagedObject 子类中的方法以实现对映射的精确控制。

这是我最近的一个项目的一个片段:

// override MagicalRecord's implementation with additional set up for Dialogue relationship
- (BOOL) importValuesForKeysWithObject:(id)objectData {
    BOOL result = [super importValuesForKeysWithObject:objectData];

    // update lesson-dialogue data
    id dialogueDicts = [objectData objectForKey:@"dialogue"];
    if ([dialogueDicts isKindOfClass:[NSArray class]]) {
        for (id dialogueDict in dialogueDicts) {
            DialogueSentence *dialogue = [DialogueSentence findFirstByAttribute:@"id" withValue:[[dialogueDict objectForKey:@"id"]];
            if (dialogue == nil) {
                dialogue = [DialogueSentence createEntity];
            }
            [dialogue importValuesForKeysWithObject:dialogueDict];
            [self addDialoguesObject:dialogue];    // connect the relationship
        }
    }

    return result;
}

顺便说一句,您可能想要创建 NSManagedObject 子类的类别并在那里编写覆盖代码,因为当您升级 Core Data 模型版本并重新生成 NSManagedObject 子类时,您自己的代码不会被清除。

于 2012-08-21T15:11:42.267 回答