Swift 4解码是JSON的两倍
我以为我已经确定了这个概念 我正在发送一个JSON,其中包含一个doubleSwift 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
{"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,这样就不需要将其解析为字符串。