web-dev-qa-db-ja.com

Swift:構造体をJSONに変換しますか?

structを作成し、それを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"
}
15
ixany

計算されたプロパティを追加して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"}]

編集:

Swift 4はCodableプロトコルを導入し、カスタム構造体をエンコードおよびデコードする非常に便利な方法を提供します。

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

NSJSONSerializationクラス を使用します。

これを 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
        }
    }

}

構造体には2つのプロパティしかないため、JSON文字列を自分で作成する方が簡単な場合があります。

11
Scriptable

Swift 4は、Encodableプロトコルをサポートしています。

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

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

これで、JSONEncoderを使用してStructを自動的にJSONに変換できます。

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

印刷する:

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