Предположим, что MXMImageFormat
выглядит следующим образом:
struct MXMImageFormat : Codable {
let imageUrl: String
let imageFormatId: Int
let width: Int
let height: Int
}
Я думаю, что вы обдумываете это. Вы можете просто сделать:
try imageFormatList?.forEach { imgFormat in
var nested = imageContainer.nestedContainer(keyedBy: CodingKeys.ImageFormatListKey.self)
try nested.encode(imgFormat, forKey: .imageFormat)
}
Так как encode
принимает любые Encodable
, включая imgFormat
. На самом деле вам не нужно сначала преобразовывать в Data
(по крайней мере, именно поэтому вы, похоже, пытаетесь это сделать).
Некоторые тестовые коды:
let 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
}
}
]
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let model = try! decoder.decode(MXMImage.self, from: json)
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let string = String(data: try! encoder.encode(model), encoding: .utf8)!
print(string) // this should be the same JSON as the one in the string literal
Также обратите внимание, что в encode
вам не нужно использовать try?
здесь:
while !imagesFormatListContainer.isAtEnd {
let imageFormatContainer = try imagesFormatListContainer.nestedContainer(keyedBy: CodingKeys.ImageFormatListKey.self)
// here vvvvvvv
let imageFormat = try? imageFormatContainer.decode(MXMImageFormat.self, forKey: .imageFormat)
if let imageFormat = imageFormat {
imagesList.append(imageFormat)
}
}