Je ne veux pas inclure la bibliothèque autant que possible! Avez-vous déjà pensé ainsi?
Comme point de départ, j'ai remplacé SwiftyJson, qui est utilisé pour décoder JSON, par du Swift pur, qui n'avait que du mérite, donc je vais l'écrire ici. Décodons json avec une fonction Swift standard appelée JSONDecoder.
C'est une excellente chose qui rend la structure / classe décodable simplement en l'héritant.
import Foundation
struct User: Decodable {
var name: String
var age: Int
}
let json = """
{
"name": "Bob",
"age": 20,
}
"""
let jsonData = json.data(using: .utf8)!
let user = try JSONDecoder().decode(User.self, from: jsonData)
c'est tout. Dans struct, json est stocké dans struct. C'est simple et facile à utiliser.
print(user.name) // Bob
print(user.age) // 20
Bien sûr, vous pouvez également décoder JSON dont la racine est un tableau. De plus, si une clé est appliquée à json, elle est exprimée sous la forme d'un type facultatif.
import Foundation
let json = """
[
{
"name": "Bob",
"age": 30,
"password": "foo"
},
{
"name": "Ben",
"age": 20
}
]
""".data(using: .utf8)!
struct User: Decodable {
var name: String
var age: Int
var password: String?
}
let users = try JSONDecoder().decode([User].self, from: json)
for user in users {
print(user)
}
//résultat
// User(name: "Bob", age: 30, password: Optional("foo"))
// User(name: "Ben", age: 20, password: nil)
Le nom de la clé json et le nom de la clé d'objet Swift peuvent être différents. Par exemple, lorsque la clé json est user_id et que la clé d'objet swift est userId. Comme le décodage ne peut pas être effectué tel quel, utilisez l'énumération CodingKeys de Decodable pour activer le décodage.
import Foundation
let json = """
[
{
"name": "Bob",
"age": 30,
"password": "foo",
"user_id": 1
},
{
"name": "Ben",
"age": 20,
"user_id": 2
}
]
""".data(using: .utf8)!
struct User: Decodable {
var name: String
var age: Int
var password: String?
var userId: Int
private enum CodingKeys: String, CodingKey {
case name
case age
case password
case userId = "user_id"
}
}
let users = try JSONDecoder().decode([User].self, from: json)
for user in users {
print(user)
}
J'ai réussi à mapper user_id à userId.
Décodable peut être imbriqué.
struct User: Decodable {
let name: String
let children: [Child]
struct Child: Decodable {
let name: String
let teachers: [Teacher]
struct Teacher: Decodable {
let name: String
}
}
}
Par conséquent, il est possible de représenter facilement une structure de données JSON imbriquée.
import Foundation
let json = """
[
{
"name": "A",
"children": [
{
"name": "B",
"teachers": [
{
"name": "C"
}
]
}
]
},
{
"name": "E",
"children": [
{
"name": "F",
"teachers": [
{
"name": "G"
},
{
"name": "I"
}
]
}
]
}
]
""".data(using: .utf8)!
let users = try JSONDecoder().decode([User].self, from: json)
// [
// User(
// name: "A",
// children: [
// Child(
// name: "B",
// teachers: [ Teacher(name: "C") ]
// )
// ]
// ),
// User(
// name: "E",
// children: [
// Child(
// name: "F",
// teachers: [ Teacher(name: "G"), Teacher(name: "I") ]
// )
// ]
// )
// ]
Recommended Posts