gpt4 book ai didi

json - 使用 Swift 4 JSONDecoder.DataDecodingStrategy.custom(_ :)

转载 作者:行者123 更新时间:2023-12-05 02:13:39 25 4
gpt4 key购买 nike

我正在寻找 JSON 自定义策略数据解码的示例:

JSONDecoder.DataDecodingStrategy.custom(_:)

有人有例子或链接吗? Apple documentation不做过多解释。

非常感谢!

弗朗切斯科

最佳答案

下面是自定义数据编码和解码策略的更全面示例。让我们从一个非常简单的数据模型开始:

struct Model: Codable {
var data: Data
}

编码

Data 在 Swift 中被编码为 JSON 中的字符串。默认编码使用 Base64,因此如果您将 data 分配给组成字符串“Hello world”的字节,您将获得以下数据:

let m = Model(data: "Hello world".data(using: .utf8)!)
let json = try JSONEncoder().encode(m)
let jsonString = String(data: json, encoding: .utf8)!

print(jsonString) // {"data":"SGVsbG8gd29ybGQ="}

但是假设您想使用十六进制代码而不是 Base64。您可以编写自定义数据编码函数:

func customDataEncoder(data: Data, encoder: Encoder) throws {
let str = (0..<data.count).map {
String(data[$0], radix: 16, uppercase: true)
}.joined(separator: " ")

var container = encoder.singleValueContainer()
try container.encode(str)
}

let encoder = JSONEncoder()
encoder.dataEncodingStrategy = .custom(customDataEncoder)

let m = Model(data: "Hello world".data(using: .utf8)!)
let json = try JSONEncoder().encode(m)
let jsonString = String(data: json, encoding: .utf8)!

print(jsonString) // {"data":"48 65 6C 6C 6F 20 77 6F 72 6C 64"}

解码

解码是在 Swift 中将 JSON 字符串转换为 Data 的过程。如果字符串是 Base64 编码的,则您无需执行任何其他操作。但是由于我们以十六进制编码我们的 Data,您需要提供自定义数据解码器:

func customDataDecoder(decoder: Decoder) throws -> Data {
let container = try decoder.singleValueContainer()
let str = try container.decode(String.self)

let bytes = str.components(separatedBy: " ").map {
UInt8($0, radix: 16)!
}
return Data(bytes)
}

let decoder = JSONDecoder()
decoder.dataDecodingStrategy = .custom(customDataDecoder)

let decodedM = try decoder.decode(Model.self, from: json)
print(m.data == decodedM.data) // true

注意:当我说“Data in Swift is encoded into a string in Swift”时,大多数时候都是这样,但不一定每次都这样时间。没有什么能阻止您将属性 data 编码成这样的东西:

{
"data": {
"count": 11,
"string": "Hello world",
"hex": "48 65 6C 6C 6F 20 77 6F 72 6C 64"
}
}

当然,您必须更新自定义解码器以匹配 JSON 格式。

关于json - 使用 Swift 4 JSONDecoder.DataDecodingStrategy.custom(_ :),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com