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"
}
計算されたプロパティを追加して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) }
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文字列を自分で作成する方が簡単な場合があります。
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"
}