web-dev-qa-db-fra.com

Swift: Convertir struct en JSON?

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"
}
15
ixany

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) }
20
vadian

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.

11
Scriptable

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

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

10
Brett