如何为以下 API 数据创建可编码结构

Posted

技术标签:

【中文标题】如何为以下 API 数据创建可编码结构【英文标题】:how to create a codable structure for the following API data 【发布时间】:2020-10-05 10:51:21 【问题描述】:

    "status": true,
    "error": false,
    "data": [
        
            "type": 0,
            "title": "",
            "description": "",
            "data": [
                
                    "images": "/media/banner/Glocart%20Shop/Glocart-Shop_moVB3tP.jpg",
                    "is_external": true,
                    "link": "https://www.wikipedia.org/",
                    "product_id": null,
                    "offer_list_id": null,
                    "product_list_id": null
                ,
                
                    "images": "/media/banner/Grocery/Grocery_m341Az6.jpg",
                    "is_external": false,
                    "link": null,
                    "product_id": null,
                    "offer_list_id": 1,
                    "product_list_id": null
                
            ]
        ,
        
            "type": 1,
            "title": "Categories",
            "description": "",
            "data": [
                
                    "category_name": "Beverages",
                    "category_id": 5,
                    "category_icon": "/media/category_icon_upload_location/61ho157I07L._SX522__WpWCZ7h.jpg"
                ,
                
                    "category_name": "Tea & Coffee",
                    "category_id": 6,
                    "category_icon": "/media/category_icon_upload_location/Lipton-Green-Tea-Bags-250-SDL859816919-1-31762.jpg"
                ,
                
                    "category_name": "Body Care",
                    "category_id": 3,
                    "category_icon": "/media/category_icon_upload_location/nourishing-body-lotion-100ml_1024x1024.png"
                ,
                
                    "category_name": "Personal Hygiene",
                    "category_id": 7,
                    "category_icon": "/media/category_icon_upload_location/lif0259_2_1.jpg"
                ,
                
                    "category_name": "Jams & Preserves",
                    "category_id": 32,
                    "category_icon": "/media/category_icon_upload_location/kissan-mixed-fruit-jam-500-gm-164390973-ymzpr.jpg"
                ,
                
                    "category_name": "Air Fresheners",
                    "category_id": 28,
                    "category_icon": "/media/category_icon_upload_location/Godrej_Aer_Home_Air_Freshener_Spray_Morning_Misty_Meadows__fkCoOzL.jpg"
                ,
                
                    "category_name": "Chocolate",
                    "category_id": 35,
                    "category_icon": "/media/category_icon_upload_location/71p5hUVC0eL._SX569_.jpg"
                ,
                
                    "category_name": "Cosmetics & Makeup",
                    "category_id": 27,
                    "category_icon": "/media/category_icon_upload_location/81oA3GcTyRL._SL1500_.jpg"
                ,
                
                    "category_name": "Personal care",
                    "category_id": 26,
                    "category_icon": "/media/category_icon_upload_location/gillette-guard-3-card-blade-pack_rixer.png"
                
            ]
        ,
        
            "type": 2,
            "title": "Fresh Deals",
            "description": "Today's Arrival",
            "data": [
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                
            ]
        ,
        
            "type": 3,
            "title": "",
            "description": "",
            "data": [
                
                    "images": "/media/banner/Glocart%20Shop/Glocart-Shop_moVB3tP.jpg",
                    "is_external": true,
                    "link": "https://www.wikipedia.org/",
                    "product_id": null,
                    "offer_list_id": null,
                    "product_list_id": null
                ,
                
                    "images": "/media/banner/Glocart%20Shop/Glocart-Shop_moVB3tP.jpg",
                    "is_external": true,
                    "link": "https://www.wikipedia.org/",
                    "product_id": null,
                    "offer_list_id": null,
                    "product_list_id": null
                
            ]
        ,
        
            "type": 4,
            "title": "",
            "description": "",
            "data": [
                
                    "images": "/media/banner/Glocart%20Shop/Glocart-Shop_moVB3tP.jpg",
                    "is_external": true,
                    "link": null,
                    "product_id": null,
                    "offer_list_id": null,
                    "product_list_id": null
                
            ]
        ,
        
            "type": 5,
            "title": "Discount Range",
            "description": "",
            "data": [
                
                    "banner": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "discount_from": 50,
                    "discount_to": 60
                ,
                
                    "banner": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "discount_from": 40,
                    "discount_to": 100
                
            ]
        ,
        
            "type": 2,
            "title": "Top Deals",
            "description": "Upto 45% discount",
            "data": [
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                
            ]
        ,
        
            "type": 0,
            "title": "",
            "description": "",
            "data": 
                "images": "/media/banner/Glocart%20Shop/Glocart-Shop_moVB3tP.jpg",
                "is_external": true,
                "link": "https://www.wikipedia.org/",
                "product_id": null,
                "offer_list_id": null,
                "product_list_id": null
            
        ,
        
            "type": 6,
            "title": "Suggested for you",
            "description": "",
            "data": [
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                ,
                
                    "product_id": 193,
                    "image_url": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "product_name": "UNILEVER KSN PINEAPPLE SQH 750ML-RS.15 PRICE OFF",
                    "offer_price": 14500,
                    "normal_price": 15500,
                    "is_in_cart": false,
                    "cart_qty": 0
                
            ]
        ,
        
            "type": 0,
            "title": "",
            "description": "",
            "data": 
                "images": "/media/banner/Grocery/Grocery_m341Az6.jpg",
                "is_external": false,
                "link": null,
                "product_id": null,
                "offer_list_id": 1,
                "product_list_id": null
            
        ,
        
            "type": 7,
            "title": "",
            "description": "",
            "data": [
                
                    "banner": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "category_name": "Personal Care",
                    "category_id": 1,
                    "have_sub_category": true,
                    "sub_categories": [
                        
                            "category_name": "Chocolate",
                            "category_id": 35,
                            "category_icon": "/media/category_icon_upload_location/71p5hUVC0eL._SX569_.jpg"
                        ,
                        
                            "category_name": "Chocolate",
                            "category_id": 35,
                            "category_icon": "/media/category_icon_upload_location/71p5hUVC0eL._SX569_.jpg"
                        
                    ]
                
            ]
        ,
        
            "type": 7,
            "title": "",
            "description": "",
            "data": [
                
                    "banner": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "category_name": "Beauty Care",
                    "category_id": 2,
                    "have_sub_category": false,
                    "sub_categories": []
                
            ]
        ,
        
            "type": 7,
            "title": "",
            "description": "",
            "data": [
                
                    "banner": "/media/product_images/61XJQZV8YxL._SX425_.jpg",
                    "category_name": "Home Care",
                    "category_id": 3,
                    "have_sub_category": false,
                    "sub_categories": []
                
            ]
        
    ],
    "cart_items_count": 5,
    "total_cart_price": 30000,
    "is_authenticated": true,
    "new_notification_count": 1,
    "cash_back_msg": "Dummy Cash Back message"

我创建了一个..但显示错误

struct Home2Response: Codable 
    var status, error: Bool?
    var data: [Home2ResponseDatum]?
    var cartItemsCount, totalCartPrice: Int?
    var isAuthenticated: Bool?
    var newNotificationCount: Int?
    var cashBackMsg: String?

    enum CodingKeys: String, CodingKey 
        case status, error, data
        case cartItemsCount = "cart_items_count"
        case totalCartPrice = "total_cart_price"
        case isAuthenticated = "is_authenticated"
        case newNotificationCount = "new_notification_count"
        case cashBackMsg = "cash_back_msg"
    


// MARK: - Home2ResponseDatum
struct Home2ResponseDatum: Codable 
    var type: Int?
    var title: String?
    var datumDescription: String?
    var data: [Any]?

    enum CodingKeys: String, CodingKey 
        case type, title
        case datumDescription = "description"
        case data
    

【问题讨论】:

您不能将AnyCodable 一起使用。为 data Array 使用特定类型,不要使用 Any data 的合理解决方案是一个枚举,其关联类型取决于 type 你可能想看看app.quicktype.io 在线发帖提示:“.but 显示错误” 什么错误?显示错误,以及哪一行。您应该有更快的答案,我们不必阅读所有内容,并找出小错误 【参考方案1】:

JSON 中的名称应与struct 中的名称匹配。 将 datumDescription 更改为描述。

struct Data : Codable 
    let type : Int?
    let title : String?
    let description : String?
    let data : [Data]?

【讨论】:

OP 使用 CodingKey 枚举,所以这不是问题。

以上是关于如何为以下 API 数据创建可编码结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在可编码结构中使用计算属性(swift)

多部分请求 - 带有 UIImage 的可编码结构

如何为 REST API 构建 Mongo 数据库 [关闭]

如何用WINDOWS API 调用一个文件?求可编译运行的完整程序

如何为 Jellybean (API 17) 创建一个有效的 AVD?

使用可编码和静态变量的 Plist 结构类