Verstehen Sie, wie Sie den JSON-Decoder von Swift in 3 Minuten verwenden

Ich möchte eine App mit Swift so rein wie möglich machen.

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.

Grundlegende Verwendung von JSON Decoder

1. Erben Decodierbar zu strukturieren.

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
}

2. Konvertieren Sie json in Daten.


let json = """
{
  "name": "Bob",
  "age": 20,
}
"""
let jsonData = json.data(using: .utf8)!

3. Mit JSON Decoder dekodieren.


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

Abrufen von Daten von json in einem Array

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)

Benennen Sie den Schlüssel um

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.

Extrahieren Sie Daten aus verschachteltem JSON

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

Verstehen Sie, wie Sie den JSON-Decoder von Swift in 3 Minuten verwenden
Verstehe in 5 Minuten !! Wie man Docker benutzt
Wie man Lombok im Frühling benutzt
Verwendung von InjectorHolder in OpenAM
Wie verwende ich Klassen in Java?
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwendung des benannten Volumes in docker-compose.yml
Verwendung von Docker in VSCode DevContainer
Verwendung von MySQL im Rails-Tutorial
Verwendung von Umgebungsvariablen in RubyOnRails
Verwendung von credentials.yml.enc aus Rails 5.2
So montieren Sie JSON direkt in Jackson
Verwendung von ExpandableListView in Android Studio
Verwendung von Swifts Codable Super Personal Memo
[Rails] Verwendung von Auswahlfeldern in Ransack
Verwendung von JQuery in Rails 6 js.erb
[Rails] Verwendung von PostgreSQL in einer Vagrant-Umgebung
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von java.util.logging
Verwendung der Karte
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
[Ruby] Verwendung der Standardausgabe bei der bedingten Verzweigung
So implementieren Sie die Gastanmeldung in 5 Minuten im Rails-Portfolio
Verwendung der Z3-Bibliothek in Scala mit Eclipse
Verstehen Sie die Eigenschaften von Scala in 5 Minuten (Einführung in Scala)
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Verwendung der JDD-Bibliothek in Scala mit Eclipse
Verwendung des In-Memory-Job-Repositorys mit Spring Batch
Hinweise zur Verwendung regulärer Ausdrücke in Java
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse