- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 JSON
响应如下:
{
"data": [
{
"unknown-key-c3e7f0": {
"date_time": 1546944854000,
"medication": "f4f25ea4-0607-4aac-b85a-edf40cc7d5b6",
"record": {
"status": "never"
}
},
"unknown-key-619d40": {
"date_time": 1546944854000,
"medication": "deef2278-f176-418f-ac34-c65fa54e712c",
"record": {
"status": "always"
}
},
"event": "06b445b9-dae0-48a1-85e4-b9f48c9a2349",
"created": 1546949155020,
"user": "8fb3fcd1-ffe6-4fd9-89b8-d22b1653cb6a",
"id": "1546944855000",
"type": "compliance"
},
{
"unknown-key-619d40": {
"date_time": 1546944975000,
"medication": "deef2278-f176-418f-ac34-c65fa54e712c",
"record": {
"status": "sometimes"
}
},
"event": "7309d8e9-b71c-4068-b278-0ae6d91a57a6",
"created": 1546946798407,
"user": "8fb3fcd1-ffe6-4fd9-89b8-d22b1653cb6a",
"id": "1546944975000",
"type": "compliance"
}
}
从上面的响应中,我想获取未知键及其值。未知键的值是一种名为 Record
的自定义类型,它符合 Codable
协议(protocol)。
我已经为解析数据创建了这个结构
struct RecordSuper: Codable
{
var data: [[String: Record]]
}
因此,我想过滤所有其他键,如 event、created、user
等我在响应中获得的键,并仅保存未知键和值。请建议如何使用 codable 对此进行解析。
我已经阅读了这个答案以及答案的第三条评论中建议的变体。 https://stackoverflow.com/a/46369152/8330469
这个答案展示了如何过滤数组中不正确的数据,以免丢失正确的数据。我正在尝试做类似的事情。
例如,我想丢弃 event
键,因为它是 String
类型而不是 Record
类型。
上面的答案将丢弃整个字典,因为所有字典都有不正确的数据,如 event
。最后,我得到一个空数组。
提前致谢。
最佳答案
这是一个广泛基于此 intriguing answer 的解决方案的 Rob Napier .
TitleKey
和两个 Decoder
扩展的目标是将具有任意键的字典映射到数组,并将键添加为 title
属性。
struct TitleKey: CodingKey {
let stringValue: String
init?(stringValue: String) { self.stringValue = stringValue }
var intValue: Int? { return nil }
init?(intValue: Int) { return nil }
}
extension Decoder {
func currentTitle() throws -> String {
guard let titleKey = codingPath.last as? TitleKey else {
throw DecodingError.dataCorrupted(.init(codingPath: codingPath,
debugDescription: "Not in titled container"))
}
return titleKey.stringValue
}
}
extension Decoder {
func decodeTitledElements<Element: Decodable>(_ type: Element.Type) throws -> [Element] {
let titles = try container(keyedBy: TitleKey.self)
return titles.allKeys.compactMap { title in
return try? titles.decode(Element.self, forKey: title)
}
}
}
我修改了 decodeTitledElements
函数以仅解码那些值代表 RecordSuper
结构过滤其他键的字典。
这是结构。
struct Root : Decodable {
let data : [Containers]
}
struct Containers: Decodable {
let containers: [RecordSuper]
init(from decoder: Decoder) throws {
self.containers = try decoder.decodeTitledElements(RecordSuper.self)
}
}
struct RecordSuper : Decodable {
let title : String
let dateTime : Date
let medication : String
let record : Record
enum CodingKeys: String, CodingKey {
case dateTime = "date_time", medication, record
}
init(from decoder: Decoder) throws {
self.title = try decoder.currentTitle()
let container = try decoder.container(keyedBy: CodingKeys.self)
self.dateTime = try container.decode(Date.self, forKey: .dateTime)
self.medication = try container.decode(String.self, forKey: .medication)
self.record = try container.decode(Record.self, forKey: .record)
}
}
struct Record : Decodable {
let status : String
}
现在解码 JSON 假设 jsonData
是作为 Data
的 JSON
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .millisecondsSince1970
let result = try decoder.decode(Root.self, from: jsonData
print(result.data)
关于swift - 为具有失败响应的字典数组实现 Codable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160875/
给定这个类: class MyClass: Codable { var variable : Codable? = nil } 我得到错误: Type 'MyClass' does not c
鉴于 Array 符合 Codable 我假设 Codable 的数组,即 [Codable] 应该肯定可转换为 Codable。 我已经用 Decodable 部分做了一个简单的例子。并且只是为了验
我希望创建一个类来存储 Date 和任何符合 Codable 协议(protocol)的对象。我希望此类也符合 Codable 协议(protocol)本身。 我可以按如下方式为一个对象执行此操作:
ClassA 符合 Cadable 并具有一系列属性。其中之一是不符合 Codable 的已经存在的非常复杂的 ClassB 的属性。我可以手动解码 Codable 类的非 Codable 属性吗?
当遵循 Codable 协议(protocol)时,我不能轻易跳过非 Codable 类的可选属性 在 Ride 结构中,我们希望跳过 driver 属性的编码 和解码,并保留它 nil 解码时:
假设我有一些 JSON,如下所示: { "some-random-key": { "timestamp": 1234123423
很多人告诉我,codable 比使用 swiftyjson 好得多,所以我正在尝试一下。我想将此 JSON 的返回值 https://api.gdax.com/products/BTC-USD/boo
我有一个 Codable 类型,比方说 Car ,它被定义为: struct Car: Codable { let age: Int let color: String } 我可以很好
我正在尝试实现类似于 Swift 如何在实现 Codable 的类中定义的枚举上使用 CodableKeys 协议(protocol)集的方式。在我的例子中,类是 CommandHandler,枚举是
我正在尝试将“Object Mapper”转换为“Codable”。我来自服务的响应包括 NSArray,其中包含自定义对象。我需要在 Codable 类中使用 NSArray 和 NSDiction
使用 Codable,我可以创建以下扩展 extension Decodable { public static func decode(data: Data, decoder: JSONDe
我有一个 API,它以前缀表示法接收查询。例如(+ 1 2)这可以递归地完成,例如(+ 1 (- 1 2)) 准确地说,所需的 json 如下所示: { "query":[ {
struct Data: Codable { let name: String? let dataArray: [User] = [User]() } dataArray 是可选的,所以我想用
这个问题在这里已经有了答案: check the json response is array or int or string for a key? (7 个答案) 关闭 3 年前。
我正在使用通用编码器来传递网络响应。我创建了以下函数来解码数据并返回结果: 这是该函数的一部分: guard let jsonDataUnwrapped = jsonData,
我有一个问题,我想我已经掌握了每个问题的基础知识,但不太确定如何将它们结合起来。 在 View Controller 中我有一个基本的 var 设置: var shipments = [Shipmen
我有一个(恼人的)情况,我的后端返回一个像这样的对象: { "user": { "name": [ "John" ], "fam
这个问题在这里已经有了答案: Swift 4 JSON Decodable with multidimensional and multitype array (5 个答案) 关闭 5 年前。 AP
我的 JSON 响应如下: { "data": [ { "unknown-key-c3e7f0": { "date_ti
我正在尝试为一个对象采用 Codable 协议(protocol),该对象必须从我的 Web 服务返回的 JSON 实例化以响应其中一个 API 调用。 其中一个属性是enumeration类型,可选
我是一名优秀的程序员,十分优秀!