我有一个Codable
对象,我需要将其转换为Dictionary
,所以我首先 encoding 将其转换为Data
,然后使用{{1 }}将该JSONSerialization
转换为Data
,然后使用Any
获取字典。
转换成功,但是由于使用as? [String: Any]
,JSONSerialisation
类型正在转换为Bool
,但是我想保留{{1 }}
NSNumber
输出
[“元”:{ 演示= 1; },“ employeeID”:1]
demo 属性正在转换为Bool
,但我想保留Dictionary
值
答案 0 :(得分:0)
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"]!
旁注:
尽可能声明结构成员为非可选,而不是相反。
答案 1 :(得分:0)
这应该可以解决问题:
struct Meta: Codable {
let demo: Bool?
public init(demo : Bool) {
self.demo = demo
}
enum CodingKeys: String, CodingKey {
case demo = "demo"
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
demo = try container.decode(Bool.self, forKey: .demo)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.demo, forKey: .demo)
}
}
JSON表示仍然是一个数字,但可以正确解码回Bool。