1 直接上代码
struct Student:JSONCodable {
var name:String
var sex:Int = 0
}
protocol JSONCodable:Codable {
}
extension JSONCodable{
func toJSONData() -> Data? {
return self.toData()
}
private func toData() -> Data? {
let encoder = JSONEncoder.init()
let data = try? encoder.encode(self)
return data
}
func toJSON() -> Any? {
if let data = self.toData() {
let dict = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)
return dict
}
return nil
}
func toJSONString() -> String? {
if let data = self.toData() {
let str = String.init(data: data, encoding: String.Encoding.utf8)
return str
}
return nil
}
static func decode(data:Data)->Self? {
let decoder = JSONDecoder.init()
let tempM = try? decoder.decode(Self.self, from: data)
return tempM
}
static func decode(jsonDict:Any)->Self? {
if let data2 :Data = try? JSONSerialization.data(withJSONObject: jsonDict, options: []) {
let tempM = self.decode(data: data2)
return tempM
}
return nil
}
static func decode(json:String)->Self? {
if let data = json.data(using: String.Encoding.utf8, allowLossyConversion: false) {
let tempM = self.decode(data: data)
return tempM
}
return nil
}
}
2 使用
let model = Student.init(name: "小明", sex: 1)
// 转换字典
let dict = model.toJSON()
// 解析字典
let model1 = Student.decode(jsonDict: dict!)
// 转换json字符串
let str = model.toJSONString()
// 解析json字符串
let model2 = Student.decode(json: str!)
//转换data
let jsonD = model.toJSONData()
// 解析data
let model3 = Student.decode(data: jsonD!)
print("dict \(dict) str\(str) jsonD \(jsonD) model1 \(model1) model2\(model2) model3\(model3)")
网友评论