gpt4 book ai didi

ios - 使用 Codable 将复杂的 json 解码为没有嵌套结构的简单结构

转载 作者:行者123 更新时间:2023-11-28 10:10:37 27 4
gpt4 key购买 nike

让我们有一个 json

{
"channelId": 100,
"channel_name": "STV 1",
"stream": {
"URL": "www.rtvs.sk",
"DRM": "secureMedia",
"drmKeys": ["1", "2", "3"],
"userInfo": {
"user": "Michal23",
"userIsTester": true
}
}
}

和一个结构:

struct Channel : Codable {
var channelId : Int
var channelName : String
var channelUrl : URL

private enum CodingKeys : String, CodingKey {
case channelId
case channelName = "channel_name"
case channelUrl = "URL" <===??? json path somehow?
}
}

我想从嵌套流中获取 URL,但不为其创建嵌套结构。是否可以?怎么办?

最佳答案

查看 documentation ,你可以做到,但它比平时更需要手动过程。您需要对嵌套容器进行解码,然后使用编码 key 提取信息。

//: Playground - noun: a place where people can play

import UIKit

let jsonData = """
{
"channelId": 100,
"channel_name": "STV 1",
"stream": {
"URL": "www.rtvs.sk"
}
}
""".data(using: String.Encoding.utf8)!

struct Channel {
var channelId : Int
var channelName : String
var channelUrl: URL

private enum CodingKeys : String, CodingKey {
case channelId
case channelName = "channel_name"
case stream
}

private enum AdditionalInfoKeys: String, CodingKey {
case channelUrl = "URL"
}
}

extension Channel: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
channelId = try values.decode(Int.self, forKey: .channelId)
channelName = try values.decode(String.self, forKey: .channelName)

let additionalInfo = try values.nestedContainer(keyedBy: AdditionalInfoKeys.self, forKey: .stream)
channelUrl = try additionalInfo.decode(URL.self, forKey: .channelUrl)

}
}

let decoder = JSONDecoder()
let channel = try? decoder.decode(Channel.self, from: jsonData)
print(channel)

OUTPUT: Channel(channelId: 100, channelName: "STV 1", channelUrl: www.rtvs.sk))

关于ios - 使用 Codable 将复杂的 json 解码为没有嵌套结构的简单结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48767142/

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