J'ai créé un struct
et je veux l'enregistrer en tant que fichier JSON.
struct Sentence {
var sentence = ""
var lang = ""
}
var s = Sentence()
s.sentence = "Hello world"
s.lang = "en"
print(s)
... ce qui se traduit par:
Sentence(sentence: "Hello world", lang: "en")
Mais comment puis-je convertir l'objet struct
en quelque chose comme:
{
"sentence": "Hello world",
"lang": "en"
}
Vous pouvez ajouter une propriété calculée pour obtenir la représentation JSON et une fonction statique (classe) pour créer un tableau JSON à partir d'un tableau 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"}]
Modifier:
Swift 4 introduit le protocole Codable
qui fournit un moyen très pratique pour encoder et décoder des structures personnalisées.
struct Sentence : Codable {
let sentence : String
let lang : String
}
let sentences = [Sentence(sentence: "Hello world", lang: "en"),
Sentence(sentence: "Hallo Welt", lang: "de")]
do {
let jsonData = try JSONEncoder().encode(sentences)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString) // [{"sentence":"Hello world","lang":"en"},{"sentence":"Hallo Welt","lang":"de"}]
// and decode it back
let decodedSentences = try JSONDecoder().decode([Sentence].self, from: jsonData)
print(decodedSentences)
} catch { print(error) }
Utilisez la classe NSJSONSerialization .
En utilisant ceci pour référence , vous devrez peut-être créer une fonction qui renvoie la chaîne sérialisée JSON. Dans cette fonction, vous pouvez prendre les propriétés requises et en créer un NSDictionary et utiliser la classe mentionnée ci-dessus.
Quelque chose comme ça:
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
}
}
}
Parce que votre structure n'a que deux propriétés, il peut être plus simple de créer vous-même la chaîne JSON.
Swift 4 prend en charge le protocole Encodable, par ex.
struct Sentence: Encodable {
var sentence: String?
var lang: String?
}
let sentence = Sentence(sentence: "Hello world", lang: "en")
Vous pouvez maintenant convertir automatiquement votre Struct en JSON à l'aide d'un JSONEncoder:
let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(sentence)
Imprimez le:
let jsonString = String(data: jsonData, encoding: .utf8)
print(jsonString)
{
"sentence": "Hello world",
"lang": "en"
}