如何创建匹配MarketStack API嵌套JSON的Decodable结构体?
解决MarketStack API JSON解析的Decodable结构体设计问题
要正确解析MarketStack返回的嵌套JSON结构,你需要对应JSON的层级关系定义两个Decodable结构体:一个对应根对象,另一个对应data数组中的单个数据项。
步骤1:定义单个行情数据的结构体
首先创建一个结构体,用来存储data数组中每个对象里的目标字段(high和low):
struct StockData: Decodable { let high: Double let low: Double // 如果需要其他字段(比如date、symbol),直接添加对应的属性即可 }
步骤2:定义根响应结构体
接下来定义根结构体,对应整个JSON的结构,其中包含data数组(类型为[StockData]):
struct MarketStackResponse: Decodable { let data: [StockData] // 如果需要处理pagination信息,可以添加以下属性: // let pagination: Pagination } // 可选:如果需要解析pagination字段,补充这个结构体 struct Pagination: Decodable { let limit: Int let offset: Int let count: Int let total: Int }
步骤3:使用JSONDecoder解析数据
拿到API返回的数据后,用JSONDecoder进行解析:
do { let response = try JSONDecoder().decode(MarketStackResponse.self, from: apiData) // 访问data数组中的第一个元素的high和low if let firstStock = response.data.first { print("最高价格: \(firstStock.high)") print("最低价格: \(firstStock.low)") } // 遍历所有行情数据 for stock in response.data { print("High: \(stock.high), Low: \(stock.low)") } } catch { print("解析错误: \(error)") }
为什么你之前的写法错误?
- 第一个
ScrapeStruct直接定义high和low,但这些字段并不在JSON的根层级,而是嵌套在data数组的元素中,所以解码器找不到对应字段。 - 第二个写法重复定义
data属性,且high/low不是合法的类型(应该用Double),违反了Swift的语法和Decodable的规则。
内容的提问来源于stack exchange,提问作者madrigal00
相关产品推荐
相关产品推荐

