在Swift中使用Codable解析



需要以这样一种方式解析这个JSON,即我应该能够访问与"enabled"中的每个计划相关的好处。item "中的关键字;节点如下:

让项目=项目[0].plans.main [0] .enabled[0]。text

{
"MyData": {
"data": {
"benefits": {
"B1": {
"text": "Text1"
},
"B2": {
"text": "Text2"
},
"B3": {
"text": "text3"
}
}
},
"items": [
{
"plans": {
"main": [
{
"name": "plan1",
"enabled": [
"B1",
"B2"
],
"disabled": [
"B2",
"B3"
]
}
]
}
}
]
}
}

我已经尝试如下实现,但似乎这是不工作

class Main: Codable {

var name: String?

var enabled: [String]?
var disabled: [String]?

enum CodingKeys: String, CodingKey {
case name = "name"
case enabled = "enabled"
case disabled = "disabled"
}
class MyData: Codable {
var benefits: [String: Benefit]?

enum CodingKeys: String, CodingKey {
case benefits = "benefits"
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let propertyContainer = try container.nestedContainer(keyedBy: CustomDynamicKey.self, forKey: .benefits)
self.benefits = propertyContainer.decodeValues()
}
class Benefit: Codable {

var text: String?

enum CodingKeys: String, CodingKey {
case text = "text"
}

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

text = try container.decode(String.self, forKey: .text)
}
}
struct CustomDynamicKey: CodingKey {

var stringValue: String
init?(stringValue: String) {
self.stringValue = stringValue
}

var intValue: Int? { return nil }

init?(intValue: Int) { return nil }

extension KeyedDecodingContainer where Key == DynamicKey {

func decodeValues() -> [String : Benefit] {
var dict = [String : Benefit]()
for key in allKeys {
if let md = try? decode(Benefit.self, forKey: key) {
dict[key.stringValue] = md
} else {
print("unsupported key")
}
}
return dict
}
}

我尝试逐个解析模型。然而,我能够单独访问模型,但我需要在使用手动解析所需的init()方法内解析JSON本身时,将相应的好处与各自的计划进行映射。

一种方法是将JSONDecoderJSONSerialization一起使用。在这种情况下使用Codables有点不舒服,您可以使var benefits: [String: Benefit]?成为可选的(您已经有了),并将其从CodingKeys枚举中删除。然后,使用JSONSerialization来填充benefits字段。

看到这个

相关内容

  • 没有找到相关文章

最新更新