在 Swift/Foundation 中,有许多不同类型的数字。您的 NSKeyValueCoding
已设置为 NSNumber
的实例(请参见以下 JSON 序列化文档摘录),因此您需要按原样读取,然后根据需要要求将此 NSNumber
转换为 Float
:
if let n = d.value(forKey: "probability") as? NSNumber {
let f = n.floatValue
}
JSONSerialization
文档中写到:
一个可转换为 JSON 的 Foundation 对象必须具有以下特性:
- 顶层对象是一个NSArray或NSDictionary。
- 所有对象都是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例。
- 所有字典键都是NSString的实例。
- 数字不是NaN或无穷大。
您正在使用错误的API。
除非确实需要KVC,否则不要使用KVC(valueForKey
)。
获取字典值时,请始终使用键订阅(或objectForKey
)。
if let probability = d["probability"] as? Float {
print(probability)
}
Decodable :
struct User: Decodable {
let name: String
let gender: String
let probability: Float
let count: Int
}
let str = "{ \"name\": \"Tomas\", \"gender\": \"male\", \"probability\":0.99, \"count\": 594 }"
let data = str.data(using: .utf8)!
do {
let user = try JSONDecoder().decode(User.self, from: data)
} catch {
// handle errors
}
这里有一些内部消息:
当Swift将浮点数从JSON转换为浮点数时,它会进行某种验证,以确保数字落在浮点数据类型支持的终止分数值上。
例如,如果您的值是0.25(四分之一)、0.875(八分之七)等,则不会出现错误。
如果您的值不落在这些终止分数上(例如0.33),则假定由于精度不足可能会丢失一些数据,并引发错误。
如果您不关心潜在的数据损失,以下是一种将值转换为浮点数而不必担心太多的方法:
Float(jsonDictionary["jsonDictionaryKey"] as! Double)
Double
的,但它们的工作方式相同。) - LinusGeffarth