Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swift 4 JSONDecoder.DataDecodingStrategy.Custom()自定义JSON数据解码_Json_Swift4 - Fatal编程技术网

使用Swift 4 JSONDecoder.DataDecodingStrategy.Custom()自定义JSON数据解码

使用Swift 4 JSONDecoder.DataDecodingStrategy.Custom()自定义JSON数据解码,json,swift4,Json,Swift4,我正在寻找JSON自定义策略数据解码示例: JSONDecoder.DataDecodingStrategy.custom(_:) 有人有关于的例子或链接吗?没有太多的解释 多谢各位 Francesco这里有一个更全面的自定义数据编码和解码策略示例。让我们从一个非常简单的数据模型开始: struct Model: Codable { var data: Data } 编码 Swift中的数据被编码为JSON中的字符串。默认编码使用Base64,因此如果将数据分配给构成字符串“Hell

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

JSONDecoder.DataDecodingStrategy.custom(_:)
有人有关于的例子或链接吗?没有太多的解释

多谢各位


Francesco

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

struct Model: Codable {
    var data: Data
}
编码 Swift中的
数据
被编码为JSON中的字符串。默认编码使用Base64,因此如果将
数据
分配给构成字符串“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": {
        "count": 11,
        "string": "Hello world",
        "hex": "48 65 6C 6C 6F 20 77 6F 72 6C 64"
    }
}

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

Perfect!非常感谢-D
{
    "data": {
        "count": 11,
        "string": "Hello world",
        "hex": "48 65 6C 6C 6F 20 77 6F 72 6C 64"
    }
}