我有一个Codable
对象,我需要将其转换为Dictionary
,因此我首先encode将其转换为Data
,然后使用JSONSerialization
将其从Data
转换为Any
然后使用as? [String: Any]
获取字典。
转换成功,但是由于使用了JSONSerialisation
,Bool
类型正在转换为NSNumber
,但是我想将Bool
值保留在Dictionary
内
import Foundation
struct Employee: Codable {
let employeeID: Int?
let meta: Meta?
}
struct Meta: Codable {
let demo: Bool?
}
let employeeObject = Employee(employeeID: 1, meta: Meta(demo: true))
do {
let encodedObject = try JSONEncoder().encode(employeeObject)
let dictionary = try JSONSerialization.jsonObject(with: encodedObject, options: .fragmentsAllowed) as? [String: Any]
print(dictionary ?? [:])
} catch {
print(error)
}
输出
[“ meta”:{演示= 1; },“ employeeID”:1]
demo属性正在转换为NSNumber
,但我想保留Bool
值
print
输出具有误导性。这与内部隐式桥接到NSDictionary
尽管该值打印为1
,但类型为布尔值,请参见
let meta = dictionary!["meta"] as! [String:Any]
print(type(of: meta["demo"]! )) // __NSCFBoolean
您的担心是没有原因的,因为要从[String:Any]
字典中获取值,无论如何都要转换类型
let demo = meta[demo] as! Bool
或者您必须将字典转换为[String:Bool]
let meta = dictionary!["meta"] as! [String:Bool]
let demo = meta["demo"]!