2015-12-11 59 views
1

使用RestKit我無法映射以下JSON: 如您所見,語言屬性/關係不包含任何語言實體的關鍵信息。使用RestKit映射JSON而不使用屬性名稱

{ 
    "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」的OrderedSet像:

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關係船。

謝謝,任何幫助表示讚賞。

+0

我假設「恩」和「ES」的標識和「英語」和「獵犬」的名字?因此,在解析這個JSON之後,是否最終需要兩個'語言'對象,其中'firstLanguage.identifier =='en「'和firstLanguage.name ==」English「'和secondLanguage.identifier ==」es「 '和'secondLanguage.name ==「Espanol」'?如果是這樣的話,我會用這個信息來澄清你的問題。 – Jeff

+0

正確。爲了清楚起見,我將編輯我的問題 –

回答

0

這個映射它解決了:

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) 
    ) 

由於任何人如何幫腔

0

像往常一樣爲嵌套內容創建映射,然後在其上設置forceCollectionMapping使RestKit將字典轉換爲數組以供映射處理。