Swift4.1中JSON解析Float出现异常行为的技术问询
解决JSON解析Float类型的异常问题
嘿,我明白你遇到的这个JSON解析Float的麻烦了——之前我也踩过类似的坑!你的函数出现不符合预期的行为,核心原因是**JSONSerialization会把JSON里的所有数字都解析成NSNumber类型**,而在Swift里直接用as? Float强转NSNumber时,经常会因为类型匹配的不确定性导致解析失败或者结果不符合预期(比如JSON里的数字被解析成Double/Int时,直接转Float可选型就容易出问题)。
修复后的可靠实现
下面是调整后的函数,通过先获取NSNumber再转换为Float,能稳稳处理各种数字类型的JSON字段:
func parseMyFloat(jsonString: String) -> Float? { guard let data = jsonString.data(using: .utf8, allowLossyConversion: true), let parsedJSON = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any], let numberValue = parsedJSON?["myFloat"] as? NSNumber else { return nil } return numberValue.floatValue }
为什么这样改就没问题?
- JSON里的数字不管是整数(比如
5)还是浮点数(比如2.718),JSONSerialization都会统一解析成NSNumber,而NSNumber的floatValue方法可以安全地把内部存储的数值转换成Float类型,不管它原本是Double还是Int。 - 你原来的代码直接用
as? Float,虽然偶尔能成功,但在一些精度场景或者类型隐式转换的情况下很容易掉链子,用NSNumber中转就稳定多了。
更推荐的方案:用Codable简化解析
如果你的项目允许,我强烈建议用Swift自带的Codable框架来做JSON解析,不仅代码更简洁,还能保证类型安全,完全避免手动解析的繁琐和潜在错误:
struct MyData: Codable { let myFloat: Float } func parseMyFloatWithCodable(jsonString: String) -> Float? { guard let data = jsonString.data(using: .utf8) else { return nil } do { let decodedData = try JSONDecoder().decode(MyData.self, from: data) return decodedData.myFloat } catch { print("解析出错啦:\(error)") return nil } }
Codable会自动帮你处理所有类型转换和结构解析,根本不用你手动去一层层拆JSON字典,维护起来超省心~
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

