- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
那是我的JSON案例
{
"image_id": 11101,
"image_source_id": 9,
"image_author": "",
"image_copyright": "",
"image_format_list": [{
"image_format": {
"image_url": "https://static.musixmatch.com/images-storage/mxmimages/1/0/1/1/1/11101_2.jpg",
"image_format_id": 2,
"width": 150,
"height": 150
}
},
{
"image_format": {
"image_url": "https://static.musixmatch.com/images-storage/mxmimages/1/0/1/1/1/11101_16.jpg",
"image_format_id": 16,
"width": 451,
"height": 500
}
}
]
}
struct MXMImage : Decodable, Encodable, Equatable {
let imageId: Int
let imageSourceId: Int
let imageAuthor: String?
let imageCopyright: String?
let imageFormatList: [MXMImageFormat]?
enum CodingKeys: String, Swift.CodingKey {
case imageId
case imageSourceId
case imageAuthor
case imageCopyright
case imageFormatList
enum ImageFormatListKey: String, CodingKey {
case imageFormat
}
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
imageId = try (container.decodeIfPresent(Int.self, forKey: .imageId) ?? 0)
imageSourceId = try (container.decodeIfPresent(Int.self, forKey: .imageSourceId) ?? 0)
imageAuthor = try? container.decodeIfPresent(String.self, forKey: .imageAuthor)
imageCopyright = try? container.decodeIfPresent(String.self, forKey: .imageCopyright)
var imagesFormatListContainer = try container.nestedUnkeyedContainer(forKey: .imageFormatList)
var imagesList:[MXMImageFormat] = []
while !imagesFormatListContainer.isAtEnd {
let imageFormatContainer = try imagesFormatListContainer.nestedContainer(keyedBy: CodingKeys.ImageFormatListKey.self)
let imageFormat = try? imageFormatContainer.decode(MXMImageFormat.self, forKey: .imageFormat)
if let imageFormat = imageFormat {
imagesList.append(imageFormat)
}
}
self.imageFormatList = imagesList
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(imageId, forKey: .imageId)
try container.encodeIfPresent(imageSourceId, forKey: .imageSourceId)
try container.encodeIfPresent(imageAuthor, forKey: .imageAuthor)
try container.encodeIfPresent(imageCopyright, forKey: .imageCopyright)
var imageContainer = container.nestedUnkeyedContainer(forKey: .imageFormatList)
try imageFormatList?.forEach { imgFormat in
var nested = imageContainer.nestedContainer(keyedBy: CodingKeys.ImageFormatListKey.self)
let data = try imgFormat.encoded()
try nested.encode(data, forKey: .imageFormat)
}
}
}
image_format
键内重新缩进MXMImageFormat对象,然后对自定义数组进行编码。有可能这样做吗?提前致谢
最佳答案
除了nestedContainers
外,您还可以解码/编码[[String:MXMImageFormat]]
数组并将其映射
struct MXMImage : Codable, Equatable {
let imageId: Int
let imageSourceId: Int
let imageAuthor: String?
let imageCopyright: String?
let imageFormatList: [MXMImageFormat]?
private enum CodingKeys : String, CodingKey { case imageId, imageSourceId, imageAuthor, imageCopyright, imageFormatList}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
imageId = try container.decode(Int.self, forKey: .imageId)
imageSourceId = try container.decode(Int.self, forKey: .imageSourceId)
imageAuthor = try container.decodeIfPresent(String.self, forKey: .imageAuthor)
imageCopyright = try container.decodeIfPresent(String.self, forKey: .imageCopyright)
if let imageFormatListData = try container.decodeIfPresent([[String:MXMImageFormat]].self, forKey: .imageFormatList) {
imageFormatList = imageFormatListData.compactMap{$0["image_format"]}
} else {
imageFormatList = nil
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(imageId, forKey: .imageId)
try container.encode(imageSourceId, forKey: .imageSourceId)
try container.encodeIfPresent(imageAuthor, forKey: .imageAuthor)
try container.encodeIfPresent(imageCopyright, forKey: .imageCopyright)
if let imageFormatListData = imageFormatList {
try container.encode(imageFormatListData.map{["image_format":$0]}, forKey: .imageFormatList)
}
}
}
struct MXMImageFormat : Codable, Equatable {
let imageUrl : URL
let imageFormatId, width, height : Int
}
关于ios - Swift Codable-如何编码自定义数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60231030/
给定这个类: 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类型,可选
我是一名优秀的程序员,十分优秀!