Swift JSONDecoder 错误 - 预期解码字典<字符串、任意>但找到了一个数组



我是Swift 5.3的新手,在检索嵌套的JSON数据时遇到了问题。我的JSON数据结果如下:

{
"sites":[
{
"site_no":"16103000",
"station_nm":"Hanalei River nr Hanalei, Kauai, HI",
"dec_lat_va":22.1796,
"dec_long_va":-159.466,
"huc_cd":"20070000",
"tz_cd":"HST",
"flow":92.8,
"flow_unit":"cfs",
"flow_dt":"2020-08-18 07:10:00",
"stage":1.47,
"stage_unit":"ft",
"stage_dt":"2020-08-18 07:10:00",
"class":0,
"percentile":31.9,
"percent_median":"86.73",
"percent_mean":"50.77",
"url":"https://waterdata.usgs.gov/hi/nwis/uv?site_no=16103000"
}
]
}

我的结构如下:

struct APIResponse: Codable {
let sites: APIResponseSites
}
struct APIResponseSites: Codable {
let station_nm: String
let stage: Float
}

我的解码SWIFT如下:

let task = URLSession.shared.dataTask(with: url, completionHandler: {
data, _, error in
guard let data = data, error == nil else {
return
}

var result: APIResponse?
do {
result = try JSONDecoder().decode(APIResponse.self, from: data)
}
catch {
print("Failed to decode with error: (error)")
}

guard let final = result else {
return
}

print(final.sites.station_nm)
print(final.sites.stage)

})

当然,我得到了一个错误,它指出:

解码失败,出现错误:typeMismatch(Swift.Dictionary<Swift.String,Any>,Swift。DecodingError.Context(编码路径:[CodingKeys(字符串值:"站点";,intValue:nil(],debugDescription:";需要解码词典<字符串,任意>但找到了一个数组&";,underlyingError:零((

我知道这与"sites"返回一个数组(单个数组(有关,但我不知道如何修复它。如果有任何帮助,我将不胜感激

错误消息很明显,您需要解析一个对象数组,而不是单个对象。

只需从更改根声明属性

let sites: APIResponseSites

let sites: [APIResponseSites]
**1.** First "sites" is an array so replace 
let sites: APIResponseSites
with
let sites: [APIResponseSites]()

**2.** As sites is a array collection, please print value like given below:
print(final.sites.first?.station_nm ?? "")
print(final.sites.first?.stage ?? 0.0)

Final code is here:

struct APIResponse: Codable {
let sites: [APIResponseSites]()
}

struct APIResponseSites: Codable {
let station_nm: String
let stage: Float
}


let task = URLSession.shared.dataTask(with: url, completionHandler: {
data, _, error in
guard let data = data, error == nil else {
return
}

var result: APIResponse?
do {
result = try JSONDecoder().decode(APIResponse.self, from: data)
}
catch {
print("Failed to decode with error: (error)")
}

guard let final = result else {
return
}

print(final.sites.first?.station_nm ?? "")
print(final.sites.first?.stage ?? 0.0)


})

相关内容

  • 没有找到相关文章

最新更新