Enumeration Case 列挙ケース

JSONDecoder.KeyDecodingStrategy.custom(_:)

A key decoding strategy defined by the closure you supply. あなたが提供するクロージャによって定義されるキーデコーディング戦略。

Declaration 宣言

case custom((_ codingPath: [CodingKey]) -> CodingKey)

Parameters パラメータ

custom

A closure that receives as a parameter an array of CodingKey instances representing the sequence of keys needed to reach the value the decoder is currently decoding. あるクロージャ、それはパラメータとしていくつかのCodingKeyインスタンスからなるある配列を受け取ります、それはデコーダが現在デコードしている値に到達するために必要とされるキーそれらからなるシーケンスを表しています。

Discussion 議論

The value associated with this case is a closure you use to map names of keys from the decoded JSON object to the names of your type’s coding keys. During decoding, the closure executes once for each key in the Decodable value. When called, the closure receives an array of CodingKey instances representing the sequence of keys needed to reach the value the decoder is currently decoding. このケース節と結び付けられる値は、あなたがキーの名前をデコード済JSONオブジェクトからあなたの型の持つコーディングキーにまでマップするために使うクロージャです。デコーディングの間、クロージャはDecodable値の中の各キーに対して一度だけ遂行します。呼び出された時、クロージャは、CodingKeyインスタンスそれらからなるある配列を受け取ります、それはデコーダが現在デコードしている値に到達するために必要とされるキーそれらからなるシーケンスを表しています。

The example below shows how to decode the properties of the nested A, B, and C structures with custom logic that you specify in the closure value associated with the custom case. 下の例は、入れ子にされたAB、そしてC構造体のプロパティを、あなたがあつらえのケース節と結び付けられたクロージャ値において指定するあつらえの論理で、デコードする方法を示します。


struct A: Codable {
    var value: Int
    var b: B
    
    struct B: Codable {
        var value: Int
        var c: C
        
        struct C: Codable {
            var value: Int
        }
    }
}


let json = """
{
    "a.value": 1,
    "b": {
        "a.b.value": 2,
        "c": {
            "a.b.c.value": 3
        }
    }
}
""".data(using: .utf8)!


let decoder = JSONDecoder()


/// An implementation of CodingKey that's useful for combining and transforming keys as strings.
struct AnyKey: CodingKey {
    var stringValue: String
    var intValue: Int?
    
    init?(stringValue: String) {
        self.stringValue = stringValue
        self.intValue = nil
    }
    
    init?(intValue: Int) {
        self.stringValue = String(intValue)
        self.intValue = intValue
    }
}

In the next example you use the AnyKey structure defined above to customize the decoding of the A, B, and C structures. 次の例においてあなたは上で定義されるAnyKey構造体を使って、AB、そしてC構造体のデコーディングをカスタマイズします。


// Customize each key to remove any preceding, dot-syntax paths.
decoder.keyDecodingStrategy = .custom { keys in
    let lastComponent = keys.last!.stringValue.split(separator: ".").last!
    return AnyKey(stringValue: String(lastComponent))!
}


let a = try decoder.decode(A.self, from: json)


print(a.b.c.value) // Prints "3"