Swift:将结构转换为 JSON?
Swift: Convert struct to 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"
}
将此用于 reference,您可能需要创建一个函数,其中 returns JSON 序列化字符串。在此函数中,您可以获取所需的属性并从中创建一个 NSDictionary 并使用上面提到的 class。
像这样:
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
}
}
}
因为您的结构只有两个属性,所以您自己构建 JSON 字符串可能更容易。
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) }
Swift 4 支持 Encodable 协议 e.g.
struct Sentence: Encodable {
var sentence: String?
var lang: String?
}
let sentence = Sentence(sentence: "Hello world", lang: "en")
现在您可以使用 JSON 编码器自动将 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"
}
这是 JSON encoding/decoding 的一个很好的扩展和方法:
extension Encodable {
func toJSONString() -> String {
let jsonData = try! JSONEncoder().encode(self)
return String(data: jsonData, encoding: .utf8)!
}
}
func instantiate<T: Decodable>(jsonString: String) -> T? {
return try? JSONDecoder().decode(T.self, from: jsonString.data(using: .utf8)!)
}
示例用法:
struct Sentence: Codable {
var sentence = ""
var lang = ""
}
let sentence = Sentence(sentence: "Hello world", lang: "en")
let jsonStr = sentence.toJSONString()
print(jsonStr) // prints {"lang":"en","sentence":"Hello world"}
let sentenceFromJSON: Sentence? = instantiate(jsonString: jsonStr)
print(sentenceFromJSON!) // same as original sentence
我创建了一个 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"
}
将此用于 reference,您可能需要创建一个函数,其中 returns JSON 序列化字符串。在此函数中,您可以获取所需的属性并从中创建一个 NSDictionary 并使用上面提到的 class。
像这样:
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
}
}
}
因为您的结构只有两个属性,所以您自己构建 JSON 字符串可能更容易。
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) }
Swift 4 支持 Encodable 协议 e.g.
struct Sentence: Encodable {
var sentence: String?
var lang: String?
}
let sentence = Sentence(sentence: "Hello world", lang: "en")
现在您可以使用 JSON 编码器自动将 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"
}
这是 JSON encoding/decoding 的一个很好的扩展和方法:
extension Encodable {
func toJSONString() -> String {
let jsonData = try! JSONEncoder().encode(self)
return String(data: jsonData, encoding: .utf8)!
}
}
func instantiate<T: Decodable>(jsonString: String) -> T? {
return try? JSONDecoder().decode(T.self, from: jsonString.data(using: .utf8)!)
}
示例用法:
struct Sentence: Codable {
var sentence = ""
var lang = ""
}
let sentence = Sentence(sentence: "Hello world", lang: "en")
let jsonStr = sentence.toJSONString()
print(jsonStr) // prints {"lang":"en","sentence":"Hello world"}
let sentenceFromJSON: Sentence? = instantiate(jsonString: jsonStr)
print(sentenceFromJSON!) // same as original sentence