Swift开发中如何映射嵌套JSON响应中的delivery_fee_types数组?
Got it, let's tackle mapping the delievery_fee_types array from your JSON response. Here's a step-by-step solution that's safe and clean:
Solution to Map
delievery_fee_types from JSON Response 1. Create a Model for Delivery Fee Types
First, make a dedicated class to hold each delivery fee type's data. This keeps your code organized and type-safe, avoiding messy nested dictionary access later:
class DeliveryFeeType { var deliveryFee: Double = 0.0 var deliveryFeeType: Int = 0 var fromTime: Int = 0 var fromTimeStr: String = "" var message: String = "" var title: String = "" var toTime: Int = 0 var toTimeStr: String = "" // Initializer to populate data from a dictionary init?(dict: [String: Any]) { // Safely unwrap and cast each required field guard let fee = dict["delievery_fee"] as? Int, let type = dict["delievery_fee_type"] as? Int, let fromT = dict["from_time"] as? Int, let fromTStr = dict["from_time_str"] as? String, let msg = dict["message"] as? String, let title = dict["title"] as? String, let toT = dict["to_time"] as? Int, let toTStr = dict["to_time_str"] as? String else { return nil // Skip invalid entries instead of crashing } self.deliveryFee = Double(fee) self.deliveryFeeType = type self.fromTime = fromT self.fromTimeStr = fromTStr self.message = msg self.title = title self.toTime = toT self.toTimeStr = toTStr } }
2. Add an Array Property to Your Main Class
In the class where your deserilize method lives, add a property to store the collection of delivery fee types:
var deliveryFeeTypes: [DeliveryFeeType] = []
3. Update the deserilize Method to Parse the Array
Modify your existing method to handle the delievery_fee_types array. I've also updated the existing field mappings to use safe casting (no more as! which can crash if data is missing):
mutating func deserilize(values: Dictionary<String, Any>?) { guard let dataDict = values else { return } // Map top-level fields with safe casting and defaults deliveryFee = Double(dataDict["delievery_fee"] as? Int ?? 0) total = Double(dataDict["total"] as? String ?? "0.0") ?? 0.0 discount = Double(dataDict["discount"] as? Int ?? 0) cartCount = Double(dataDict["cart_count"] as? String ?? "0.0") ?? 0.0 del_fee_popup = (dataDict["del_fee_popup"] as? Int ?? 0) == 1 // Parse the delivery fee types array if let feeTypesArray = dataDict["delievery_fee_types"] as? [[String: Any]] { // CompactMap filters out any invalid entries where the model init returns nil deliveryFeeTypes = feeTypesArray.compactMap { DeliveryFeeType(dict: $0) } } }
Key Safety Improvements
- Replaced risky forced casts (
as!) with optional casts (as?) and default values to prevent crashes if fields are missing or mistyped. - Used
compactMapto skip any invalid entries in thedelievery_fee_typesarray instead of crashing the whole parse. - Handled string-to-double conversions for fields like
totalandcart_countsince they're stored as strings in your JSON.
内容的提问来源于stack exchange,提问作者As If Prince
相关产品推荐
相关产品推荐

