官方有个不错的函数,只要按照JSON的结构定义数据结构,就可以将JSON解析到数据结构中。
func load<T: Decodable>(_ jsonString: String) -> T {
let data: Data
data = jsonString.data(using: .utf8)!
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse string as \(T.self):\n\(error)")
}
}
例如,JSON字符串如下:
let jsonString = """
{
"status": 200,
"message": "Succeed",
"users": [
{
"id": "1000",
"name": "test1"
},
{
"id": "2000",
"name": "test2"
}
]
}
"""
数据结构定义如下:
struct ResponseDateModel : Codable {
var status : Int
var message : String
var users : [UserModel]
struct UserModel : Codable {
var id : String
var name : String
}
}
就可以通过以下方式解析JSON
let response : ResponseDateModel = load(jsonString)
如果 JSON的key与数据结构的属性名字不一致,可手动mapping,如下所示:
struct ResponseDateModel : Codable {
var status : Int
var message : String
var users : [UserModel]
struct UserModel : Codable {
var userID : String
var name : String
enum CodingKeys: String, CodingKey {
case userID = "id"
case name = "name"
}
}
}
可以设置标准的mapping方式,蛇形命名法(snake case)到驼峰命名法(camel case)的变换
// user_id -> userId
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
可以设置解析的日期格式
let decoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(dateFormatter)