为什么在Swift中从JSON解析时,这两个值(它们似乎是字符串)中的一个被转换为Double,而第二个则不是?

为什么在Swift中从JSON解析时,这两个值(它们似乎是字符串)中的一个被转换为Double,而第二个则不是?,json,swift,parsing,double,Json,Swift,Parsing,Double,这是我的示例词典: { "gross_price" = "6.5678565676"; "gross_price_total" = "6.00"; } 现在我解析这些值: if let grossPriceTotal = dictionary["gross_price_total"] as? Double { order!.grossPriceTotal = grossPriceTotal //doesn't work } if let grossPrice

这是我的示例词典:

{ 
  "gross_price" = "6.5678565676";
  "gross_price_total" = "6.00";
}    
现在我解析这些值:

if let grossPriceTotal = dictionary["gross_price_total"] as? Double {
    order!.grossPriceTotal = grossPriceTotal
    //doesn't work
}

if let grossPriceTotal = dictionary["gross_price"] as? Double {
    order!.grossPriceTotal = grossPriceTotal
    //works
}
为什么第一个条件未转换,而第二个条件未转换?

这是应用程序的真实屏幕:


我想理解为什么在这种情况下,它确实很容易转换为
Double
,因为它看起来像一个
字符串,不应该转换?

简短回答:

  • dictionary[“gross\u price\u total”]
    是一个字符串,因此
    as?Double
    失败
  • dictionary[“gross_price”]
    是一个数字,因此
    as?双重编码
    成功。但是,
    println(字典)
    将此数字打印为
    “6.56785676”
    ,使其看起来像字符串
长答案:

下面是一个完整的示例,演示了该问题:

let jsonString = "{ \"gross_price\" : 5.23, \"gross_price_total\" : \"6.00\" }"
println("JSON: \(jsonString)")

let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
var error : NSError?
if let dictionary : AnyObject = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) {
    println("dictionary: \(dictionary)")

    if let grossPriceTotal = dictionary["gross_price_total"] as? Double {
        println(grossPriceTotal)
    } else {
        println("no grossPriceTotal")
    }

    if let grossPriceTotal = dictionary["gross_price"] as? Double {
        println(grossPriceTotal)
    } else {
        println("no gross_price")
    }
} else {
    println(error)
}
输出:

JSON: { "gross_price" : 5.23, "gross_price_total" : "6.00" } dictionary: { "gross_price" = "5.23"; "gross_price_total" = "6.00"; } no grossPriceTotal 5.23 JSON:{“总价格”:5.23,“总价格”:“6.00”} 字典:{ “毛价格”=“5.23”; “总价”等于“6.00”; } 没有总收入 5.23 “总价格”的值是一个数字,但打印字典 将其显示为字符串。此数字可以用
转换为?双击

“总价”的值是一个字符串,不能为空 是否使用
转换为?双击

因此,混淆只来自于这样一个事实:
println(字典)
用引号括起带有小数位数的数字, 这样就无法将它们与字符串区分开来

NSArray
NDDictionary
的描述格式如中所述(重点添加):

字符串用双引号括起来,例如:
“这是一个字符串”

这个 如果字符串严格由以下内容组成,则可以省略引号 字母数字字符,不包含空格(数字为 在属性列表中作为字符串处理)


你在上一篇文章中得到的答案是什么?尽管收到了有价值的解决方案,但您仍在使用相同的代码…我知道我可以使用
(“67.78”作为NSString)来实现这一点。doubleValue
,但这不是重点。我想知道,为什么有一次(当我有多于2个数字时)它被转换为
Double
,有一次(当我有2个数字时)它不是
“6.56785676”
也是一个字符串,而不是像
那样转换?双击
。您能展示一个自包含的可复制的示例吗?您试图将字符串向下转换为Double,这将总是失败的。我把你的代码放在操场上,没有编译。“从'String'转换到不相关的类型'Double'总是失败的”@martinr,我用图片添加了示例。如果你是对的,它不应该停在那条线上。。。那么为什么它停止了呢?在控制台上有来自服务器的打印响应。所以,结论是:1。如果无法直接转换为
Double
,则必须是
字符串。如果我可以转换为
Double
,这意味着即使我看到
字符串,它也必须是一个
数字
,对吗?2.这里的位数不重要,对吗?3.如果我不能转换成双倍,这意味着我是从服务器
字符串
而不是
数字
获得的,对吗?你能确认我的理解吗?我将非常感激。我如何改进我的问题,使其不再重复?因为我一直在寻找答案,但我没有找到。现在你明白我的意思了。。。感谢您的帮助@Martin R.@Bartłomiejsemanńczyk:您必须检查所有可能的类型。首先检查Double,如果失败,则检查字符串。如果失败,请设置一些默认值或报告错误或其他情况我想有些人对你的问题投了反对票,因为你似乎(再次)尝试将字符串转换为双精度,这也是我最初的想法。后来它变成了一个有趣的问题(我给了你+1)。也许你后来添加的所有信息本来都应该在那里。@Bartłomiejsemanńczyk:我看不出你的问题被标记为重复。也许有人“标记”了它,但没有结束投票。“这个问题可能已经有答案了……”不是吗?