无法在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 }