Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 4解码是JSON的两倍_Json_Swift - Fatal编程技术网

Swift 4解码是JSON的两倍

Swift 4解码是JSON的两倍,json,swift,Json,Swift,我以为我已经确定了这个概念 我正在发送一个JSON,其中包含一个double {"elementName":"Security:Driver","element_Cost":"650"} 我已经创建了CodingKeys和解码器扩展,但在发送数据时仍然会出现类型不匹配错误 struct ElementCosts: Content { let elementName: String let elementCost: Double enum CodingKeys: Str

我以为我已经确定了这个概念

我正在发送一个JSON,其中包含一个double

{"elementName":"Security:Driver","element_Cost":"650"}
我已经创建了CodingKeys和解码器扩展,但在发送数据时仍然会出现类型不匹配错误

struct ElementCosts: Content {
    let elementName: String
    let elementCost: Double

    enum CodingKeys: String, CodingKey {

        case elementCost = "element_Cost"
        case elementName
    }
}

extension ElementCosts: Decodable {

    public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        elementCost = try values.decode(Double.self, forKey: .elementCost)
        elementName = try values.decode(String.self, forKey: .elementName)
    }
}
看看这里的其他帖子,我看不出我做错了什么

我试图将数据类型更改为Int,但仍然存在相同的问题

有什么想法吗?

“650”
是字符串,不是数字

你可以这样解析它

let elementCostString = try values.decode(String.self, forKey: .elementCost)
elementConst = Double(elementCostString) ?? 0
或者将其更改为模型上的字符串,以对您更合适的为准。

“650”
是字符串,而不是数字

你可以这样解析它

let elementCostString = try values.decode(String.self, forKey: .elementCost)
elementConst = Double(elementCostString) ?? 0

或者将其更改为模型上的字符串,以对您更合适的为准。

请阅读错误消息<代码>可编码错误消息具有很强的描述性。它甚至会告诉您实际的类型(
xyz)。您不需要扩展名,您可以免费获得初始值设定项。请阅读错误消息<代码>可编码
错误消息具有很强的描述性。它甚至会告诉您实际的类型(
xyz)。你不需要扩展,你可以免费得到初始化器。我唯一要改变的是,如果不能转换成double,就抛出一个错误,而不是合并成0。如果数据不好,这似乎更可能是您想要的行为。@JohnMontgomery我完全同意,但是我认为答案代码应该简洁,并关注问题,在本例中,解析JSON数据。错误处理和其他事情最好留给读者去做。问题是JSON必须经过字符串化才能发送,将数字转换成字符串。所以我需要把它转换回来。我认为使用Double.self对其进行解码会告诉解码器应该尝试将字符串解码为Double。@salongley虽然JSON基本上是一种字符串表示,但是
“650”
650
之间有区别,请注意第一个中的引号。第一个将被解释为字符串,第二个将被解释为数字。如果您可以控制创建JSON,那么您应该考虑在不使用引号的情况下生成JSON,这样您就不需要将其解析为字符串。这里我唯一要更改的是,如果无法将其转换为double,而不是合并为0,则会抛出一个错误。如果数据不好,这似乎更可能是您想要的行为。@JohnMontgomery我完全同意,但是我认为答案代码应该简洁,并关注问题,在本例中,解析JSON数据。错误处理和其他事情最好留给读者去做。问题是JSON必须经过字符串化才能发送,将数字转换成字符串。所以我需要把它转换回来。我认为使用Double.self对其进行解码会告诉解码器应该尝试将字符串解码为Double。@salongley虽然JSON基本上是一种字符串表示,但是
“650”
650
之间有区别,请注意第一个中的引号。第一个将被解释为字符串,第二个将被解释为数字。如果您可以控制JSON的创建,那么应该考虑在不使用引号的情况下生成JSON,这样就不需要将其解析为字符串。