Ios 使用不带属性名的RestKit映射JSON

Ios 使用不带属性名的RestKit映射JSON,ios,json,swift,mapping,restkit,Ios,Json,Swift,Mapping,Restkit,使用RestKit映射以下JSON时遇到问题: 如您所见,languages属性/关系不包含语言实体的任何关键信息 { "data": { "version": "1.0", "languages": { "en": "English", "es": "Espanol" } } } json-“data”对象映射到一个RootData对象,该对象适用于version属性 class RootData: NSManagedObject {

使用RestKit映射以下JSON时遇到问题: 如您所见,languages属性/关系不包含语言实体的任何关键信息

{
  "data": {
    "version": "1.0", 
    "languages": {
      "en": "English",
      "es": "Espanol"
    }
  }
}
json-“data”对象映射到一个RootData对象,该对象适用于version属性

class RootData: NSManagedObject {
    @NSManaged var version: String?
    @NSManaged var languages: NSOrderedSet?
}
现在,我想将keypath“data.languages”映射为一组有序的语言对象,如:

class Language: NSManagedObject {
    @NSManaged var identifier: String?
    @NSManaged var name: String?
}
我想以一组语言对象作为结束:

(pseudo-code)
rootData.firstLanguage.identifier == "en"
rootData.firstLanguage.name == "English"

rootData.secondLanguage.identifier == "es"
rootData.secondLanguage.name == "Espanol"
但是我不知道如何映射RootData->Languages 1:n关系


谢谢,,非常感谢您的帮助。

像往常一样为嵌套内容创建映射,然后设置为让RestKit将字典转换为数组以供映射处理。

像往常一样为嵌套内容创建映射,然后设置为让RestKit将字典转换为数组以供映射处理句柄。

此映射解决了此问题:

let rootMap = RKEntityMapping(forEntityForName: "RootData", inManagedObjectStore: store)
let rootDict = ["data.version": "version",] as [NSObject: AnyObject]!
rootMap.addAttributeMappingsFromDictionary(rootDict)

let languagesMap = RKEntityMapping(forEntityForName: "Language", inManagedObjectStore: store)


languagesMap.forceCollectionMapping = true      // thanks @Wain
//
// the following solved my problem regarding the mapping:
// - Key not present: * map from representation
//                    * reference identifier in name-mapping
// - Add identification attribute to keep them unique
//
let languageDict = ["(identifier)": "name",] as [NSObject : AnyObject]!    
languagesMap.addAttributeMappingsFromDictionary(languageDict)
languagesMap.identificationAttributes = ["identifier"]
languagesMap.addAttributeMappingFromKeyOfRepresentationToAttribute("identifier")

rootMap.addPropertyMapping(
    RKRelationshipMapping(
        fromKeyPath: "data.languages",
        toKeyPath: "languages", 
        withMapping: languagesMap)
    )

多亏了大家的参与。

这个映射解决了这个问题:

let rootMap = RKEntityMapping(forEntityForName: "RootData", inManagedObjectStore: store)
let rootDict = ["data.version": "version",] as [NSObject: AnyObject]!
rootMap.addAttributeMappingsFromDictionary(rootDict)

let languagesMap = RKEntityMapping(forEntityForName: "Language", inManagedObjectStore: store)


languagesMap.forceCollectionMapping = true      // thanks @Wain
//
// the following solved my problem regarding the mapping:
// - Key not present: * map from representation
//                    * reference identifier in name-mapping
// - Add identification attribute to keep them unique
//
let languageDict = ["(identifier)": "name",] as [NSObject : AnyObject]!    
languagesMap.addAttributeMappingsFromDictionary(languageDict)
languagesMap.identificationAttributes = ["identifier"]
languagesMap.addAttributeMappingFromKeyOfRepresentationToAttribute("identifier")

rootMap.addPropertyMapping(
    RKRelationshipMapping(
        fromKeyPath: "data.languages",
        toKeyPath: "languages", 
        withMapping: languagesMap)
    )

多亏了大家的参与。

我假设“en”和“es”是标识符,“English”和“Espanol”是名称?因此,在解析这个JSON之后,您是否希望得到两个
Language
对象,其中
firstLanguage.identifier==“en”
firstLanguage.name==“English”
secondLanguage.identifier==“es”
secondLanguage.name==“Espanol”
?如果是这样的话,我会用这些信息来澄清你的问题。为了清楚起见,我将编辑我的问题我假设“en”和“es”是标识符,“English”和“Espanol”是名称?因此,在解析这个JSON之后,您是否希望得到两个
Language
对象,其中
firstLanguage.identifier==“en”
firstLanguage.name==“English”
secondLanguage.identifier==“es”
secondLanguage.name==“Espanol”
?如果是这样的话,我会用这些信息来澄清你的问题。为了清楚起见,我将编辑我的问题