2015-10-17 22 views
8

Ho creato un struct e voglio salvarlo come file JSON.Swift: Converti la struttura in JSON?

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

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

... che si traduce in:

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

Ma come posso convertire l'oggetto struct a qualcosa di simile:

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

Eventuali duplicati di [Convertire Dizionario di JSON in Swift] (http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s wift) (come suggerimento, puoi convertire solo un array o un dizionario in JSON, quindi in pratica hai bisogno di una rappresentazione del dizionario del valore che vuoi inserire nel formato JSON). – nhgrif

+0

Essenzialmente, sarebbe bello se potessi convertire la struct in una stringa simile a json. Quando solo array e dizionari sono convertibili in JSON, la mia domanda è: come convertire una struttura in un dizionario? – ixany

+0

Esistono librerie di terze parti come https://github.com/Hearst-DD/ObjectMapper. Non ho esperienza con quello, comunque. –

risposta

9

È possibile aggiungere una proprietà calcolata per ottenere la rappresentazione JSON e una funzione statica (di classe) per creare un array JSON da un array Sentence.

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

Come possiamo riconvertirlo in struct? –

+0

@BhavinRamani Aggiungi un inizializzatore init (dict: [String: Any]) {... 'ed estrai i valori – vadian

11

Utilizzare il NSJSONSerialization class.

Usando questo codice per reference, potrebbe essere necessario creare una funzione che restituisca la stringa serializzata JSON. In questa funzione puoi prendere le proprietà richieste e creare un NSDictionary da loro e usare la classe menzionata sopra.

Qualcosa di simile a questo:

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

} 

Perché la tua struct ha solo due proprietà che potrebbe essere più facile da costruire solo la stringa JSON da soli.

+0

Funziona bene. –

+0

Il ritorno di 'toJSON()' dovrebbe essere 'NSData'. Inoltre, la seconda chiave nel dizionario 'props' che hai creato è sbagliata. – nhgrif

+0

Ho aggiornato la seconda chiave per essere una stringa, grazie. Il secondo punto dipende da ciò che l'utente vuole restituire – Scriptable

2

Swift 4 supporta il protocollo codificabili esempio

struct Sentence: Encodable { 
    var sentence: String? 
    var lang: String? 
} 

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

Ora è possibile convertire automaticamente lo struct in JSON utilizzando un JSONEncoder:

let jsonEncoder = JSONEncoder() 
let jsonData = try jsonEncoder.encode(sentence) 

stamparlo:

let jsonString = String(data: jsonData, encoding: .utf8) 
print(jsonString) 

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

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types