无法在JSON解析中将NSNumber桥接到Float
得到此错误:
致命错误:无法将NSNumber桥接到Float。 问题是什么?
这是原始消息,它是float而不是string。
{\"name\":\"Tomas\",\"gender\":\"male\",\"probability\":0.99,\"count\":594}
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
)。
要获取字典值,请使用always subscription(或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 }