iOS JSON解析 - Codable

2018-03-12  本文已影响118人  CaryZheng

Swift版本: 4.0

通过 Codable 协议实现Swift对象与json字符串之间的互转。

简单数据结构

struct User: Codable {
    var name: String
    var age: Int
}
let jsonStr = """
{
    "name": "zzb",
    "age": 18
}
"""
        
let jsonData = jsonStr.data(using: .utf8)!

let decoder = JSONDecoder()

do {
    let userObj = try decoder.decode(User.self, from: jsonData)
    print("userObj = \(userObj)")
} catch {
    print("Decode error")
}
let user = User(name: "Cary", age: 20)
        
let encoder = JSONEncoder()
do {
    let data = try encoder.encode(user)
    let dataStr = String(data: data, encoding: .utf8)
    print("dataStr = \(String(describing: dataStr))")
} catch {
    print("Encode error")
}

复杂数据结构

enum Gender: Int, Codable {
    case male = 1
    case female
}

class Location: Codable {
    var lat: Double = 0.0
    var lon: Double = 0.0
}

struct AdvancedUser: Codable {
    var name: String
    var age: Int
    var gender: Gender
    var location: Location
}
let jsonStr = """
{
    "name": "zzb",
    "age": 18,
    "gender": 2,
    "location": {
        "lat": 99.9,
        "lon": 87.5
    }
}
"""

let jsonData = jsonStr.data(using: .utf8)!

let decoder = JSONDecoder()

do {
    let userObj = try decoder.decode(AdvancedUser.self, from: jsonData)
    print("userObj = \(userObj)")
} catch {
    print("Decode error")
}
let location = Location()
location.lat = 99.9
location.lon = 87.5
let user = AdvancedUser(name: "Cary", age: 19, gender: .male, location: location)

let encoder = JSONEncoder()
do {
    let data = try encoder.encode(user)
    let dataStr = String(data: data, encoding: .utf8)
    print("dataStr = \(String(describing: dataStr))")
} catch {
    print("Encode error")
}

Demo源码

https://github.com/CaryZheng/iOSTutorials

Swift国内社区(SwiftMic社区)

https://www.swiftmic.com

上一篇 下一篇

猜你喜欢

热点阅读