Ich möchte die Bibliothek nicht so weit wie möglich einbeziehen! Hast du das jemals gedacht?
Als Ausgangspunkt habe ich SwiftyJson, das zum Dekodieren von JSON verwendet wird, durch reines Swift ersetzt, das nur Verdienste hatte, also werde ich es hier aufschreiben. Lassen Sie uns json mit einer Standard-Swift-Funktion namens JSONDecoder dekodieren.
Es ist eine großartige Sache, die struct / class dekodierbar macht, indem sie es einfach erbt.
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)
das ist alles. In struct wird json in struct gespeichert. Es ist einfach und leicht zu bedienen.
print(user.name) // Bob
print(user.age) // 20
Natürlich können Sie auch JSON dekodieren, dessen Stamm ein Array ist. Wenn auf json ein Schlüssel angewendet wird, wird dieser als optionaler Typ ausgedrückt.
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)
}
//Ergebnis
// User(name: "Bob", age: 30, password: Optional("foo"))
// User(name: "Ben", age: 20, password: nil)
Der Name des JSON-Schlüssels und der Name des schnellen Objektschlüssels können unterschiedlich sein. Zum Beispiel, wenn der JSON-Schlüssel user_id und der schnelle Objektschlüssel userId ist. Da die Decodierung nicht so ausgeführt werden kann, wie sie ist, verwenden Sie die CodingKeys-Enumeration von Decodable, um die Decodierung zu aktivieren.
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)
}
Ich konnte user_id erfolgreich der userId zuordnen.
Decodierbar kann verschachtelt werden.
struct User: Decodable {
let name: String
let children: [Child]
struct Child: Decodable {
let name: String
let teachers: [Teacher]
struct Teacher: Decodable {
let name: String
}
}
}
Daher ist es möglich, eine verschachtelte JSON-Datenstruktur einfach darzustellen.
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