首页 > 解决方案 > 使用 Codable 解码 JSON 适用于一个调用,但不适用于具有相同属性的另一个调用

问题描述

我正在从事一个涉及地震的项目,我已经调用了震级为 4.5 或更大的地震 URL,并且数据被正确解码。我在控制台上看到响应:https ://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_week.geojson

问题出在我使用另一个 URL 时:https ://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_week.geojson 。此 URL 返回与上述 URL 相同的属性,但无法正确解码。

我尝试过的事情:

  1. 使响应的属性可选
  2. 为响应创建单独的模型

这就是我的模型:

struct Earthquake: Codable {
let type: String?
let metadata: Metadata?
let features: [Feature]
let bbox: [Double]?

}
// MARK: - Metadata
struct Metadata: Codable {
    let generated: Int
    let url: String
    let title: String
    let status: Int
    let api: String
    let count: Int
}


// MARK: - Feature
struct Feature: Codable {
    let type: String
    let properties: Properties
    let geometry: Geometry
    let id: String?
}

// MARK: - Properties
struct Properties: Codable {
    let mag: Double?
    let place: String?
    let time, updated: Int?
    let tz: Int?
    let url: String?
    let detail: String?
    let felt: Int?
    let cdi, mmi: Double?
    let alert: String?
    let status: String?
    let tsunami, sig: Int?
    let net: String?
    let code, ids: String?
    let sources: String?
    let types: String?
    let nst: Int?
    let dmin: Double?
    let rms: Double
    let gap: Int?
    let magType: String?
    let type: String?
    let title: String?

}

// MARK: - Geometry
struct Geometry: Codable {
    let type: String
    let coordinates: [Double]
}

我就是这样称呼它的。

let topEarthQuakesURL = URL(string: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_week.geojson")!
let task = URLSession.shared.dataTask(with: topEarthQuakesURL) { (data, response, error) in
    guard let data = data else {return}
    print(data)

    let decoder = JSONDecoder()
    let EarthquakeData = try! decoder.decode(Earthquake.self, from: data)
    print(EarthquakeData.features[0].geometry.coordinates)
}

task.resume()

我得到这个错误。请注意,它 print's out 1064216 bytes。这告诉我我正在获取数据,它只是在某一时刻没有正确解码。只是不确定在哪里。

1064216 bytes
Fatal error: 'try!' expression unexpectedly raised an error: 
Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: 
[CodingKeys(stringValue: "features", intValue: nil), _JSONKey(stringValue: "Index 29", intValue:
 29), CodingKeys(stringValue: "properties", intValue: nil), CodingKeys(stringValue: "gap", 
intValue: nil)], debugDescription: "Parsed JSON number <231.67> does not fit in Int.", 
underlyingError: nil)): file 
/Users/olerma/Documents/EarthQuakes/Urth/Urth/Controller/MainViewController.swift, line 33

标签: iosjsonswiftmodel-view-controllercodable

解决方案


properties -> gap ----- 解析的 JSON 编号 <231.67> 不适合 Int。

所以改变

let gap: Int?

let gap: Double?

推荐阅读