import Foundation
let jsonString = "{\"code\":0,\"message\":\"\",\"data\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Google2\",\"url\":\"http://www.google.com\"}]}"
let jsonString2 = "{\"code\":200,\"message\":\"Unknown Error\",\"data\":{\"key\":\"value\"}}"
// String -> Dictionary || Array
if let data = jsonString.data(using: .utf8) {
let jsonObject = try? JSONSerialization.jsonObject(with: data) as? [String: AnyObject]
print("\(jsonObject ?? [:])")
}
// Dictionary || Array -> String
let data = try? JSONSerialization.data(withJSONObject: ["code":0,"message":"","data":["aa","bb"]], options: .prettyPrinted)
print("\(String(data: data!, encoding: .utf8)!)")
// String -> Model
protocol HumanReadable {
func toHuman() -> String?
}
extension Array: HumanReadable where Element: HumanReadable {
func toHuman() -> String? {
var str = ""
for data in self {
str += "[\(data.toHuman() ?? "")],"
}
return str
}
}
struct SuccessData: Codable, HumanReadable {
var name: String?
var url: String?
enum CodingKeys : String, CodingKey {
case name
case url
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decode(String.self, forKey: CodingKeys.name)
url = try values.decode(String.self, forKey: CodingKeys.url)
}
func toHuman() -> String? {
return "name=\(name ?? ""),url=\(url ?? "")"
}
}
struct ErrorData: Codable, HumanReadable{
var key: String?
enum CodingKeys : String, CodingKey {
case key
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
key = try values.decode(String.self, forKey: CodingKeys.key)
}
func toHuman() -> String? {
return "key=\(key ?? "")"
}
}
struct Result<T: Codable & HumanReadable>: Codable, HumanReadable {
var code: Int
var message: String?
var data: T?
enum CodingKeys : String, CodingKey {
case code
case message
case data
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
code = try values.decode(Int.self, forKey: CodingKeys.code)
message = try values.decode(String.self, forKey: Result.CodingKeys.message)
data = try values.decode(T.self, forKey: CodingKeys.data)
}
func toHuman() -> String? {
return "\(data?.toHuman() ?? "")"
}
}
let decoder = JSONDecoder()
let result = try decoder.decode(Result<Array<SuccessData>>.self, from: jsonString.data(using: String.Encoding.utf8)!)
print(result.toHuman()!)
let result2 = try decoder.decode(Result<ErrorData>.self, from: jsonString2.data(using: String.Encoding.utf8)!)
print(result2.toHuman()!)
备注:HumanReadable 用来实现打印结构体中的属性