gpt4 book ai didi

Swift Decodable - 如何解码经过 base64 编码的嵌套 JSON

转载 作者:行者123 更新时间:2023-12-03 09:22:54 34 4
gpt4 key购买 nike

我正在尝试解码来自第三方 API 的 JSON 响应,其中包含已进行 base64 编码的嵌套/子 JSON。
人为示例 JSON

{
"id": 1234,
"attributes": "eyAibmFtZSI6ICJzb21lLXZhbHVlIiB9",
}
PS "eyAibmFtZSI6ICJzb21lLXZhbHVlIiB9"{ 'name': 'some-value' } base64 编码。
我目前有一些代码可以对此进行解码,但不幸的是我必须重新实例化一个额外的 JSONDecoder()内部 init为了做到这一点,这并不酷......
人为的示例代码

struct Attributes: Decodable {
let name: String
}

struct Model: Decodable {

let id: Int64
let attributes: Attributes

private enum CodingKeys: String, CodingKey {
case id
case attributes
}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

self.id = try container.decode(Int64.self, forKey: .id)

let encodedAttributesString = try container.decode(String.self, forKey: .attributes)

guard let attributesData = Data(base64Encoded: encodedAttributesString) else {
fatalError()
}

// HERE IS WHERE I NEED HELP
self.attributes = try JSONDecoder().decode(Attributes.self, from: attributesData)
}
}
有没有办法在不实例化额外的 JSONDecoder 的情况下实现解码? ?
PS:我无法控制响应格式,也无法更改。

最佳答案

attributes只包含一个键值对,这是一个简单的解决方案。
它将 base64 编码的字符串直接解码为 Data – 这可以通过 .base64 实现数据解码策略——并用传统的方式反序列化 JSONSerialization .该值被分配给成员 nameModel结构。
如果 base64 编码的字符串无法解码 DecodingError会被抛出

let jsonString = """
{
"id": 1234,
"attributes": "eyAibmFtZSI6ICJzb21lLXZhbHVlIiB9",
}
"""

struct Model: Decodable {

let id: Int64
let name: String

private enum CodingKeys: String, CodingKey {
case id, attributes
}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(Int64.self, forKey: .id)
let attributeData = try container.decode(Data.self, forKey: .attributes)
guard let attributes = try JSONSerialization.jsonObject(with: attributeData) as? [String:String],
let attributeName = attributes["name"] else { throw DecodingError.dataCorruptedError(forKey: .attributes, in: container, debugDescription: "Attributes isn't eiter a dicionary or has no key name") }
self.name = attributeName
}
}

let data = Data(jsonString.utf8)

do {
let decoder = JSONDecoder()
decoder.dataDecodingStrategy = .base64
let result = try decoder.decode(Model.self, from: data)
print(result)
} catch {
print(error)
}

关于Swift Decodable - 如何解码经过 base64 编码的嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64110305/

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