JSON解析中无法将NSNumber转换为Float

14

出现以下错误:

致命错误:无法将NSNumber转换为Float。有什么问题?

图片描述在此

图片描述在此

这是原始信息,它是浮点数而不是字符串。

{\"name\":\"Tomas\",\"gender\":\"male\",\"probability\":0.99,\"count\":594}

enter image description here


不,它在原始的JSON中是浮点数。 - János
1
错误显示返回值为NSNumber,无法将其转换为float。因此,请尝试使用以下代码:“d.value(forKey:"probability")!.floatValue”。 - Y_Y
这篇帖子中的转换方法中,有没有一种适合你的?(它是针对Double的,但它们的工作方式相同。) - LinusGeffarth
1
你为什么还要纠结于字典表示法呢?符合“Decodable”协议不是更容易吗? - Gereon
4个回答

33

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

0

您正在使用错误的API。

除非确实需要KVC,否则不要使用KVC(valueForKey)。

获取字典值时,请始终使用键订阅(或objectForKey)。

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

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
}

-1

这里有一些内部消息:

当Swift将浮点数从JSON转换为浮点数时,它会进行某种验证,以确保数字落在浮点数据类型支持的终止分数值上。

例如,如果您的值是0.25(四分之一)、0.875(八分之七)等,则不会出现错误。

如果您的值不落在这些终止分数上(例如0.33),则假定由于精度不足可能会丢失一些数据,并引发错误。

如果您不关心潜在的数据损失,以下是一种将值转换为浮点数而不必担心太多的方法:

Float(jsonDictionary["jsonDictionaryKey"] as! Double)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接