无法在JSON解析中将NSNumber桥接到Float

时间:2018-04-02 11:49:03

标签: ios json swift

收到此错误:

  

致命错误:无法将NSNumber桥接到Float。有什么问题?

enter image description here

enter image description here

这是原始邮件,它是float而不是字符串。

customCommand

enter image description here

3 个答案:

答案 0 :(得分:26)

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或无穷大。
  •   

答案 1 :(得分:0)

您使用的是错误的API。

除非你真的需要KVC,否则不要使用KVC(valueForKey)。

要获取字典值,请始终使用密钥订阅(或objectForKey

if let probability = d["probability"] as? Float {
    print(probability)
}

答案 2 :(得分:0)

我建议完全放弃字典表示并使用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
}