Enumeration Case 列挙ケース

JSONEncoder.KeyEncodingStrategy.custom(_:)

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

Declaration 宣言

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

Parameters パラメータ

custom

A closure that provides the full path to the current encoding position, and returns a customized coding key. あるクロージャ、それは現在のエンコーディング位置への完全なパスを提供します、そしてあつらえられたコーディングキーを返します。

Discussion 議論

The value associated with this case is a closure you use to choose the names of keys in the encoded JSON object. During encoding, the closure executes once for each key in the Encodable value. The closure receives an array of CodingKey instances representing the sequence of keys needed to reach the value the encoder is currently encoding. このケース節と結び付けられる値は、あなたがそのエンコードされたJSONオブジェクトの中のキーの名前を選ぶために使うあるクロージャです。エンコーディングの間、クロージャはEncodable値の中の各キーに対して一度だけ遂行します。クロージャは、CodingKeyインスタンスそれらからなるある配列を受け取ります、それはエンコーダが現在エンコードしている値に到達するために必要とされるキーそれらからなるシーケンスを表しています。

The example below shows how to encode 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構造体のプロパティそれらを、customケース節と結び付けられたクロージャ値においてあなたが指定するあつらえの論理でエンコードする方法を示します。


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 a: A = A(value: 1, b: .init(value: 2, c: .init(value: 3)))


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


let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let encodeAndPrint = { print(String(data: try encoder.encode(a), encoding: .utf8) ?? "String encoding error.") }


/// 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 encoding of the A, B, and C structures. 次の例においてあなたは上で定義されるAnyKey構造体を使って、AB、そしてC構造体のエンコーディングをカスタマイズします。


// Customize each `value` key to contain a dot-syntax path.
encoder.keyEncodingStrategy = .custom { keys in
    if keys.last!.stringValue == "value" {
        return AnyKey(stringValue: "a." + keys.map { key in
            key.stringValue
        }.joined(separator: "."))!
    } else {
        return keys.last!
    }
}


try encodeAndPrint()

Here’s the JSON object that results from the custom encoding above: ここにJSONオブジェクトがあります、それは上のあつらえのエンコーディングからの結果です:


 {
     "a.value": 1,
     "b": {
         "a.b.value": 2,
         "c": {
            "a.b.c.value": 3
         }
     }
 }