我有一个 Json(接收为文本),我将它转换成这样:
if let jsonData = raw.data(using: String.Encoding.utf8) {
if let json = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) {
let products = json["products"] as! [Dictionary<String, AnyObject>]
Products 包含一个产品数组(也是 json),其中我有键,其值可以是 String、Float、Double...一个键有一个值,它可以是任何类型的数字。
当从端点接收文本时,该字段看起来像这样:\"min_size\":\"0.01\"
但也可以有类似 \"min_size\"的值:\"1\"
,或 \"min_size\":\"0.001\"
。在我的 json 转换后看起来像这样(使用 po
打印):
▿ 1 : 2 elements
- key : "min_size"
- value : 1
或者
▿ 15 : 2 elements
- key : "min_size"
- value : 0.01
但是,当我尝试在我的代码中访问它时(我想将它作为 float 读取,独立地读取它是 1 还是 0.01),我得到了这个:
let k = item["min_size"] // contains > ▿ Optional<Any> - some : 0.01
let i = item["min_size"] as? Float // contains > nil
let j = item["min_size"] as? Int // contains > nil
let y = item["min_size"] as? NSString // contains > "0.01"
let z = y!.floatValue // contains > "0.009999997"
我是 Swift 的新手,我不明白这里发生了什么。
- 为什么我不能直接将值(1 或 0.01)转换为 float ?
- 如果不是,我该怎么做才能获得该字段的 float ?
- 最重要的 对我来说很奇怪...为什么要转换为“0.01”的 NSString value 和 floatValue,结果不一样?舍入不是 选项,因为它也可能是一个很长的小数。它可以是任何小数或整数。
知道我做错了什么吗?
最佳答案
根据评论中的建议,我实现的解决方案是:
let min_size = (item["min_size"] as? String ?? "").convertFromJSONStringToFloat()
我有两个字符串和 float 的扩展
extension String {
func convertFromJSONStringToFloat() -> Float? {
let partNumber = self.split(separator: ".")
return (Float(self)?.roundToDecimal((partNumber.count > 1) ? partNumber[1].count : 1))!
}
}
extension Float {
func roundToDecimal(_ fractionDigits: Int) -> Float {
let multiplier = pow(10, Double(fractionDigits))
return Float((Double(self) * multiplier) / multiplier)
}
}
关于JSON 从字符串到 float 的转换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66274294/