0

用唯一一个参数从这种结构创建 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 回答