0

この構造からパラメーターを 1 つだけ使用して JSON を作成する最もエレガントな方法は何ですか?

    struct SessionStorage: Encodable {
        var value: String

        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
        /// the magic
        }

        enum CodingKeys: String, CodingKey {
            case params
        }
    }

この JSON 文字列に?

{"params": {"value": "{value}"}}

ネストされた構造体を作成したくありません。

4

1 に答える 1

1

ふたつのやり方:

  1. 辞書を次のようにエンコードします[String: SessionStorage]

    struct SessionStorage: Encodable {
        var value: String
    }
    
    let session = SessionStorage(value: "Foo")
    
    do {
        let jsonData = try JSONEncoder().encode(["params" : session])
        print(String(data: jsonData, encoding: .utf8)!)
    } catch { print(error) }
    
  2. エンベロープ構造体を使用する

    struct Envelope : Encodable {
        let params : SessionStorage
    }
    
    
    struct SessionStorage: Encodable {
        var value: String
    }
    
    let envelope = Envelope(params : SessionStorage(value: "Foo"))
    
    do {
        let jsonData = try JSONEncoder().encode(envelope)
        print(String(data: jsonData, encoding: .utf8)!)
    } catch { print(error) }
    

私見ですが、エレガンスの問題ではなく、効率の問題です。エレガンスは特定せずencode(toCodingKeys

于 2017-12-19T13:54:52.133 に答える