Я пытался получить JSONEncoder
dataEncodingStrategy
работу.
Мне нужно получить данные http тела без экранирования при запросах API, и это withoutEscapingSlashes: JSONEncoder.OutputFormatting
из JSONEncoder
но, к сожалению, это только для 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 стратегии ) никогда не вызывается.
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
всегда уволен, несмотря ни на что. никогда не вызывается. Это не осуждается или что-то. Кто-нибудь знает, что здесь происходит?
Хотя этот вопрос относится c к JSONEncoder
dataEncodingStrategy
, любой другой подход для сохранения данных тела http без экранирования для iOS <13 также будет полезно. </em>