Swift JSONEncoder.dataCodingStrategy пользовательская функция не вызывается - PullRequest
0 голосов
/ 08 апреля 2020

Я пытался получить 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>

1 Ответ

1 голос
/ 08 апреля 2020

dataEncodingStrategy специально для кодирования значений типа Data, а не типов, таких как String, которые поддерживаются изначально.

К сожалению, вы, насколько мне известно, единственный вариант для iOS <13 - это в основном делайте то, что пытались сделать при закрытии стратегии кодирования - используйте <code>.replacingOccurrences(of: "\\/", with: "/") в закодированной строке JSON.

...