json - 如何在可编码解码过程中处理空数组

标签 json swift codable

当“address”数组不为空时效果很好。但是当“地址”数组为空时它会失败。任何帮助将不胜感激。我有地址对象的结构。基本上“地址”是“地址”类型的对象数组,但是本地址为空时它会失败。

{
    "success": "1",
    "message": "You have succesfully verified your mobile no",
    "details": {
        "customer_id": 825,
        "is_delivery_available": "0",
        "is_registration_complete": "0",
        "is_customer_verified": "0",
        "customer_status": "0",
        "cart_count": "0",
        "name_type": "mr",
        "firstname": "",
        "lastname": "",
        "full_name": "",
        "pincode": "",
        "profile_pic": "",
        "mobile": "8583846677",
        "email": "",
        "address": [

        ],
        "referral_code": ""
    }
}

以上是我尝试在 Swift4 中使用 Codable 解码的 JSON。

import Foundation

struct Signup: Codable {
    var success:String?
    var message:String?
    var details:Details?

    private enum CodingKeys: String, CodingKey { case success, message, details }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        success = try values.decode(String.self, forKey: .success)
        message = try values.decode(String.self, forKey: .message)
        if let _details = try? values.decode(Details.self, forKey: .details) {
            details = _details
        }
    }
}

struct Details: Codable {
    var address:[Address]?
    var cart_count:String?
    var customer_id:String?
    var customer_status:String?
    var email:String?
    var firstname:String?
    var full_name:String?
    var is_customer_verified:String?
    var is_delivery_available:String?
    var is_registration_complete:String?
    var lastname:String?
    var mobile:String?
    var name_type:String?
    var pincode:String?
    var profile_pic:String?
    var referral_code:String?

    private enum CodingKeys: String, CodingKey { case address, cart_count, customer_id, customer_status, email, firstname, full_name, is_customer_verified, is_delivery_available, is_registration_complete, lastname, mobile, name_type, pincode, profile_pic, referral_code }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)

        ****-->>> Issue is in this line. How to handle empty array while decoding. <<<--****
        address = try? values.decode([Address].self, forKey: .address) 

        cart_count = try values.decode(String.self, forKey: .cart_count)
        customer_id = try values.decode(String.self, forKey: .customer_id)
        customer_status = try values.decode(String.self, forKey: .customer_status)
        email = try values.decode(String.self, forKey: .email)
        firstname = try values.decode(String.self, forKey: .firstname)
        full_name = try values.decode(String.self, forKey: .full_name)
        is_customer_verified = try values.decode(String.self, forKey: .is_customer_verified)
        is_delivery_available = try values.decode(String.self, forKey: .is_delivery_available)
        is_registration_complete = try values.decode(String.self, forKey: .is_registration_complete)
        lastname = try values.decode(String.self, forKey: .lastname)
        mobile = try values.decode(String.self, forKey: .mobile)
        name_type = try values.decode(String.self, forKey: .name_type)
        pincode = try values.decode(String.self, forKey: .pincode)
        profile_pic = try values.decode(String.self, forKey: .profile_pic)
        referral_code = try values.decode(String.self, forKey: .referral_code)
    }
}

struct Address: Codable {
    var address_default:String?
    var address_id:String?
    var address_type:String?
    var city:String?
    var customer_id:String?
    var flat_or_house_or_office_no:String?
    var full_address:String?
    var full_name:String?
    var landmark:String?
    var lat:String?
    var lng:String?
    var mobile:String?
    var name_type:String?
    var pincode:String?
    var street_or_society_or_office_name:String?
}

我深陷其中。如何在 Swift4 Codable 中解码 json 数据时处理空数组。

最佳答案

我遇到了这个问题,我按照下面的方法解决了这个问题。

if let _address = try? values.decode([Address].self, forKey: .address) {
    address = _address
} else {
    address = []
}

你可以试一试。


2022.06.08 更新。

根据@Amin Benarieb

let _address = try? values.decode([Address].self, forKey: .address) ?? []

关于json - 如何在可编码解码过程中处理空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502409/

相关文章:

python - 解析随每个 API 查询而变化的 JSON 对象

python - Django: IOError [Errno 2] 使用 python 读取 JSON 文件路径时没有这样的文件或目录

json - Rails3 : Take control over generated JSON (to_json with datamapper ORM)

ios - 导航栏中带有大标题或搜索栏的 UIRefreshControl 的故障动画

ios - 单击后如何隐藏按钮

ios - 链接器命令失败,退出代码为 1(使用 -v 查看调用)Apple Mach 链接器错误

json - 如何使用 swift Codable 协议(protocol)解码以 "["开头的 JSON

json - Scalaz 树到 JSON

ios - 如何在 Swift 4 中验证 JSON?

ios - 使用 Codable 协议(protocol)根据日期对从 API 接收的数据进行排序