SwiftUI学习 - 使用Codable解析JSON

官方有个不错的函数,只要按照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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容