JSON 未解码为结构( fatal error ,Swift)

标签 json swift struct

我正在尝试解码以下 JSON 响应:

{"success":true,"initialprice":"0.00003592","price":"0.00006587",
"high":"0.00006599","low":"0.00003499","volume":"0.68979910",
"bid":"0.00006205","ask":"0.00006595"}

Swift 中的结构如下所示:

struct TOTicker : Codable {
public var success : Bool?
public var initialprice : Double?
public var price : Double?
public var high : Double?
public var low : Double?
public var volume :Double?
public var bid :Double?
public var ask :Double?
}

我用来解码的代码行如下:

let decoder = JSONDecoder()
let ticker = try! decoder.decode(TOTicker.self, from: jsonData)

它一直抛出一个 fatal error ,但我不知道为什么。我以前用这个方法解码没有问题。

最佳答案

首先,要知道错误的原因是什么,您应该执行 do-catch block 而不是 try!:

do {
    let ticker = try decoder.decode(TOTicker.self, from: jsonData)
} catch {
    print(error)
}

因此,您会注意到错误是:

typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "initialprice", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))

这似乎很清楚;您的 json 包含 strings 作为值而不是 double 值(浮点值由“”包围)。您应该做的是将 TOTicker 属性声明为:

struct TOTicker : Codable {
    public var success : Bool?
    public var initialprice : String?
    public var price : String?
    public var high : String?
    public var low : String?
    public var volume :String?
    public var bid :String?
    public var ask :String?
}

现在,您会注意到您能够成功解析它:

let decoder = JSONDecoder()

do {
    let ticker = try decoder.decode(TOTicker.self, from: jsonData)
    print(ticker)
} catch {
    print(error)
}

你应该在日志中看到:

TOTicker(success: Optional(true), initialprice: Optional("0.00003592"), price: Optional("0.00006587"), high: Optional("0.00006599"), low: Optional("0.00003499"), volume: Optional("0.68979910"), bid: Optional("0.00006205"), ask: Optional("0.00006595"))

关于JSON 未解码为结构( fatal error ,Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51003573/

相关文章:

c# - 是否可以在 C# 中有一个名为 bool 的字段?

javascript - 使用 Javascript 的递归方法

javascript - parseInt() 不会将数组的每个数组元素转换为整数

ios - 如何防止从对象的 NSUserDefaults 检索中获取 <uninitialized>

mysql - 我应该如何在我的数据库中存储优惠券类型?

swift - 基本 TableView 问题

ios - 无法将字符串...转换为 Swift 中的字符串

我可以创建适用于不同字节序的颜色结构吗?

c - 结构内的结构,使用 typedef 和数组

c - 我正在创建一个函数来直接在 C 中创建节点。但是,我不知道如何实现节点的命名部分