0

我一直在努力找JSONEncoder工作dataEncodingStrategy

我需要获取我的 http 正文数据而不在 API 请求中转义withoutEscapingSlashes: JSONEncoder.OutputFormattingJSONEncoder但不幸的是,这仅适用于 iOS >= 13,而我的应用程序支持 iOS >= 11。

这就是我目前所拥有的:

let encoder = JSONEncoder()
if #available(iOS 13, *) {
   encoder.outputFormatting = .withoutEscapingSlashes
} else {
   // Fallback to earlier versions here!
   // Looking for a workaround and I believe "dataEncodingStrategy" is what I am looking for.
}
try encoder.encode(data)

这是 Playground 的一个简单示例,用于测试目的,向您展示我写的内容。

JSONEncoder.DataEncodingStrategy.custom(即var strategy)永远不会被调用。

import Foundation

struct Model: Encodable {
    let key: String = "key goes here..."
}

var strategy: JSONEncoder.DataEncodingStrategy = .custom({ (data, encoder) in
    print("CALLED!") // This is never printed.
    if var string = String(data: data, encoding: .utf8) {
        string = string.replacingOccurrences(of: "key", with: "REPLACED")
        var container = encoder.singleValueContainer()
        let data = string.data(using: .utf8)
        try container.encode(data)
    }
})

let encoder = JSONEncoder()
encoder.dataEncodingStrategy = strategy

let m = Model()
let d = try! encoder.encode(m)
let str = String(data: d, encoding: .utf8)
print(str)

dataEncodingStrategy无论如何总是被解雇。它永远不会被调用。它没有被弃用或什么的。有人知道这里发生了什么吗?

虽然这个问题是特定于JSONEncoder's 的dataEncodingStrategy,但对于 iOS < 13,任何其他保留 http 正文数据而不转义的方法也会有所帮助。

4

1 回答 1

1

dataEncodingStrategy专门用于编码 type 的值Data,而不是原生String支持的类型。

不幸的是,据我所知,对于 iOS < 13,您唯一的选择是基本上做您在编码策略闭包中尝试做的事情——.replacingOccurrences(of: "\\/", with: "/")在编码的 JSON 字符串上使用。

于 2020-04-08T18:13:38.823 回答