3

json のデコードに問題があります。私は多くのチュートリアルに従いましたが、複雑なjson構造は使用していません。簡単にするために、コードを最小化し、Dog を例として使用します。

次の json では、主に Dog 構造体にのみ関心があります。json の "Data" 属性には、ランダムな犬の名前が含まれています。属性名がわからないため、コーディングキーを使用できません。

{
     "Response": "success"
     "BaseLinkUrl": "https://wwww.example.com",
     "Data": {
         "Max": {
             "name": "Max",
             "breed": "Labrador"
         },
         "Rocky": {
             "name": "Rocky",
             "breed": "Labrador"
         },
         ...
    }
}

私は次の構造体を持っています:

struct DogResponse : Decodable {
    let data : DogResponseData

    enum CodingKeys: String, CodingKey {
        case data = "Data"
    }
}

struct DogResponseData: Decodable {
    let dog: Dog //this is a random variable name

    enum CodingKeys: String, CodingKey {
        case dog = "??random_variable_dog_name??"
    }
}

struct Dog: Decodable {
    let name: String
    let type: String

    enum CodingKeys: String, CodingKey {
        case name
        case type = "breed"
    }
}

Dog 構造体の収集:

let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse)

Dog 構造体を含む確率変数を迅速に認識するために、「DogResponseData」構造体で何をする必要がありますか?

4

2 に答える 2

2

可能な解決策は、カスタム初期化子を記述して辞書をデコードし[String:Dog]、値を配列にマップすることです

struct Dog : Decodable {
    let name : String
    let breed : String
}

struct DogResponse : Decodable {
    let dogs : [Dog]

    private enum CodingKeys: String, CodingKey {
        case data = "Data"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let data = try values.decode([String : Dog].self, forKey: .data)
        dogs = Array(data.values)
    }
}

let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse.dogs)

================================================== =========================

または、辞書構造を維持したい場合は、さらに短くなります

struct Dog : Decodable {
    let name : String
    let breed : String
}

struct DogResponse : Decodable {
    let dogs : [String : Dog]

    private enum CodingKeys: String, CodingKey {
        case dogs = "Data"
    }
}
于 2017-12-02T11:56:16.743 に答える