gpt4 book ai didi

json - Swift 4 Decodable 和换行符\n

转载 作者:可可西里 更新时间:2023-11-01 01:57:54 27 4
gpt4 key购买 nike

<分区>

iTunes 搜索 API 返回有时包含换行符 (\n) 的 JSON。

这使得解码失败。

你可以在这里看到一个例子:

curl “https://itunes.apple.com/search?term=Ruismaker&entity=software&media=software&limit=1

这是我精简的(实际响应中还有更多)域结构:

public struct iTunesSoftware: Codable {

enum CodingKeys: String, CodingKey {
case iTunesDescription = "description"
}

public var iTunesDescription: String?
}

这是一些测试代码:

let jstring = """
{
"description": "This App requires \n iPad 4, Mini 2",
}
"""
// try it with and without the newline to see the problem
let encoded = String(jstring.filter { !" \n\t\r".contains($0) })
let encodedData = encoded.data(using: .utf8)!
//let encodedData = jstring.data(using: .utf8)!

然后解码:

let decoder = JSONDecoder()    
do {
let app = try decoder.decode(iTunesSoftware.self, from: encodedData)
print(app)
} catch {
print(error)
}

但实际上,您会从对 REST 服务的调用中取回一个数据对象。

 let task = session.dataTask(with: url) {
(data, _, err) -> Void in

// I have a Data object, not a String here.
// I can do this:
if let s = String(data: data, encoding: .utf8) {
filter it, turn it back into a Data object, then decode
let encoded = String(s.filter { !" \n\t\r".contains($0) })
let encodedData = encoded.data(using: .utf8)
var encodedData: Data?
if let s = String(data: responseData, encoding: .utf8) {
// filter it, turn it back into a Data object, then decode
let encoded = String(s.filter { !" \n\t\r".contains($0) })
encodedData = encoded.data(using: .utf8)
}
guard let theData = encodedData else {
return
}

// and then later:
let app = try decoder.decode(iTunesSoftware.self, from: theData)

所以,我的问题是:真的吗?这是一个非常常见的用例 - 它来自 Apple REST 服务。你会认为解码器会允许你设置一些东西来忽略控制字符。

JSONDecoder 具有各种策略属性,例如:

open var dataDecodingStrategy: JSONDecoder.DataDecodingStrategy

您是否应该创建一个自定义的 KeyedDecodingContainer 来覆盖 String 的解码?

我是否漏掉了一些明显的东西?

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