2015-10-17 108 views
8

我創建了一個struct並希望將其另存爲JSON文件。Swift:將結構轉換爲JSON?

struct Sentence { 
    var sentence = "" 
    var lang = "" 
} 

var s = Sentence() 
s.sentence = "Hello world" 
s.lang = "en" 
print(s) 

...這會導致:

Sentence(sentence: "Hello world", lang: "en") 

但我怎麼能在struct對象轉換爲類似:

{ 
    "sentence": "Hello world", 
    "lang": "en" 
} 
+1

[轉換字典以JSON可能的複製

struct Sentence: Encodable { var sentence: String? var lang: String? } let sentence = Sentence(sentence: "Hello world", lang: "en") 

現在你可以使用JSONEncoder自動轉換結構成JSON在Swift中](http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s wift)(作爲一個提示,你只能將數組或字典轉換爲JSON,所以基本上你需要用JSON格式表示你想要的值)。 – nhgrif

+0

從本質上講,如果我可以將結構轉換爲類似json的字符串,那就太好了。當只有數組和字典可轉換爲JSON時,我的問題是:如何將結構轉換爲字典? – ixany

+0

有第三方庫,如https://github.com/Hearst-DD/ObjectMapper。但是,我沒有這方面的經驗。 –

回答

9

您可以添加一個計算屬性來獲取JSON表示和一個靜態(類)函數,以從Sentence數組創建JSON數組。

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    static func jsonArray(array : [Sentence]) -> String 
    { 
    return "[" + array.map {$0.jsonRepresentation}.joinWithSeparator(",") + "]" 
    } 

    var jsonRepresentation : String { 
    return "{\"sentence\":\"\(sentence)\",\"lang\":\"\(lang)\"}" 
    } 
} 


let sentences = [Sentence(sentence: "Hello world", lang: "en"), Sentence(sentence: "Hallo Welt", lang: "de")] 
let jsonArray = Sentence.jsonArray(sentences) 
print(jsonArray) // [{"sentence":"Hello world","lang":"en"},{"sentence":"Hallo Welt","lang":"de"}] 
+0

我們如何將它重新轉換爲struct? –

+0

@BhavinRamani添加初始化程序init(dict:[String:Any]){...'並提取值 – vadian

11

使用NSJSONSerialization class

將此用於reference,您可能需要創建一個返回JSON序列化字符串的函數。在這個函數中,你可以獲取所需的屬性並從它們中創建一個NSDictionary並使用上面提到的類。

事情是這樣的:

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    func toJSON() -> String? { 
     let props = ["Sentence": self.sentence, "lang": lang] 
     do { 
      let jsonData = try NSJSONSerialization.dataWithJSONObject(props, 
      options: .PrettyPrinted) 
      return String(data: jsonData, encoding: NSUTF8StringEncoding) 
     } catch let error { 
      print("error converting to json: \(error)") 
      return nil 
     } 
    } 

} 

因爲你的結構只具有兩個屬性可能更容易,只是自己構建JSON字符串。

+0

它確實工作正常。 –

+0

'toJSON()'的返回應該是'NSData'。另外,你創建的'props'字典中的第二個關鍵字是錯誤的。 – nhgrif

+0

我已將第二個鍵更新爲字符串,謝謝。第二點取決於用戶想要返回的內容 – Scriptable