iOS中不使用JSONDecoder解析带随机键的JSON对象的方法
解析方案
这种动态键的JSON结构不需要提前声明所有键,直接用[String: 子模型]类型接收动态对象字段,再提取值转为数组即可,具体实现如下:
- 先定义子模型和根响应模型
// 单个订单商品模型 struct OrderItem: Decodable { let productId: Int let productName: String let quantity: Int let price: String let variation: String } // 接口整体响应模型 struct OrderResponse: Decodable { let status: Bool // 直接用字典类型接收动态键的orderHistory对象 let orderHistory: [String: OrderItem] // 可选扩展:直接封装计算属性返回排序后的订单数组,无需后续单独处理 var sortedOrderList: [OrderItem] { // 按键的数字大小升序排列,不需要排序直接返回Array(orderHistory.values)即可 orderHistory.sorted { Int($0.key) ?? 0 < Int($1.key) ?? 0 }.map(\.value) } }
- 调用解析逻辑
do { let decoder = JSONDecoder() let result = try decoder.decode(OrderResponse.self, from: jsonData) // 直接使用sortedOrderList获取可用的订单数组即可 print(result.sortedOrderList) } catch { print("解析失败:\(error.localizedDescription)") }
注意:你给出的示例JSON存在语法错误,每个
price字段后缺少英文逗号,实际解析前需要确保后端返回的是合法JSON格式,否则会触发解析报错。
内容的提问来源于stack exchange,提问作者iOSDevManni
相关产品推荐
相关产品推荐

