如何将符合 Codable 协议的对象数组转换为 Dictionary 数组?
How can I convert an array of objects that conform Codable protocol to an array of Dictionary?
我有一个像这样的结构:
struct Demo: Codable {
var foo: String
var bar: String
...
}
我有一组演示:
let array = [Demo(foo: "a", bar: "b"), Demo(foo: "c", bar: "d")]
我想将此数组转换为字典 [[String: Any]],内容如下:
let dictionary:[[String : Any]] = array.toDictionaryFromArrayOfCodable()
我怎样才能得到它?
编辑:
我的预期输出是这样的,我想使用 JSONEncoder:
[["foo": "a", "bar": "b"], ["foo": "c", "bar": "d"]]
我找到了一个使用两个扩展的解决方案:
- 首先从对象中获取字典
- 其次,用数组的每个元素创建一个字典数组,使用第一个扩展:
用法:
let dictionary = [Demo].asDictionaryFromArray()
print(dictionary)
按预期输出:
[["bar":b,"foo":a],["bar":d,"foo":c]]
extension Encodable {
var dictionaryFromObject: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { [=11=] as? [String: Any] }
}
}
extension Array where Element: Encodable {
func asDictionaryFromArray() -> [[String: Any]] {
var dict = [[String: Any]]()
_ = self.map {
if let objectDict = [=11=].dictionaryFromObject {
dict.append(objectDict)
}
}
return dict
}
}
我有一个像这样的结构:
struct Demo: Codable {
var foo: String
var bar: String
...
}
我有一组演示:
let array = [Demo(foo: "a", bar: "b"), Demo(foo: "c", bar: "d")]
我想将此数组转换为字典 [[String: Any]],内容如下:
let dictionary:[[String : Any]] = array.toDictionaryFromArrayOfCodable()
我怎样才能得到它?
编辑: 我的预期输出是这样的,我想使用 JSONEncoder:
[["foo": "a", "bar": "b"], ["foo": "c", "bar": "d"]]
我找到了一个使用两个扩展的解决方案: - 首先从对象中获取字典 - 其次,用数组的每个元素创建一个字典数组,使用第一个扩展:
用法:
let dictionary = [Demo].asDictionaryFromArray()
print(dictionary)
按预期输出: [["bar":b,"foo":a],["bar":d,"foo":c]]
extension Encodable {
var dictionaryFromObject: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { [=11=] as? [String: Any] }
}
}
extension Array where Element: Encodable {
func asDictionaryFromArray() -> [[String: Any]] {
var dict = [[String: Any]]()
_ = self.map {
if let objectDict = [=11=].dictionaryFromObject {
dict.append(objectDict)
}
}
return dict
}
}