Comprendre comment utiliser le décodeur JSON de Swift en 3 minutes

Je veux rendre une application avec Swift aussi pure que possible.

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.

Utilisation de base du décodeur JSON

1. Héritez Decodable en struct.

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
}

2. Convertissez json en données.


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

3. Décodez avec JSON Decoder.


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

Récupérer les données de json dans un tableau

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)

Renommez la clé

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.

Extraire les données de json imbriqué

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

Comprendre comment utiliser le décodeur JSON de Swift en 3 minutes
Comprendre en 5 minutes !! Comment utiliser Docker
Comment utiliser Lombok au printemps
Comment utiliser InjectorHolder dans OpenAM
Comment utiliser les classes en Java?
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Comment utiliser le volume nommé dans docker-compose.yml
Comment utiliser Docker dans VSCode DevContainer
Comment utiliser MySQL dans le didacticiel Rails
Comment utiliser les variables d'environnement dans RubyOnRails
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Comment assembler JSON directement dans Jackson
Comment utiliser ExpandableListView dans Android Studio
Comment utiliser le mémo personnel codable de Swift
[Rails] Comment utiliser les boîtes de sélection dans Ransack
Comment utiliser JQuery dans Rails 6 js.erb
[Rails] Comment utiliser PostgreSQL dans l'environnement Vagrant
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
[Ruby] Comment utiliser la sortie standard dans le branchement conditionnel
Comment implémenter la connexion invité en 5 minutes sur le portefeuille de rails
Comment utiliser la bibliothèque Z3 dans Scala avec Eclipse
Comprendre les caractéristiques de Scala en 5 minutes (Introduction à Scala)
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Comment utiliser la bibliothèque JDD dans Scala avec Eclipse
Comment utiliser le référentiel de jobs en mémoire avec Spring Batch
Remarques sur l'utilisation des expressions régulières en Java
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java