为 JSON 创建嵌套字典

Creating nested dictionary for JSON

我正在尝试为 POST 请求复制 json 格式,但在 Swift.

中使用以下二维字典时遇到问题
payload = {"cardholder": {
    "address": {
        "city": "city",
        "state": "MA",
        "street": "street",
        "zip_code": "11111"
    },
    "shipping_address": {
        "city": "city",
        "state": "MA",
        "street": "street",
        "zip_code": "11111"
    }
}}

有什么方法可以设置 addressDetails 和 shippingDetails 吗?

            var addressDetails = ["city": self.newCity!, "state": self.newState!,"street": self.newStreet!,"zip_code": self.newZipcode!]
            var shippingDetails = ["city": self.newCity!, "state": self.newState!,"street": self.newStreet!,"zip_code": self.newZipcode!]
            if self.newUnit != ""{
                addressDetails["unit"] = self.newUnit!
                shippingDetails["unit"] = self.newUnit!
            }
            
            var test: [String:[String:[String:String]]] = ["cardholder": ["address": addressDetails]]

回答你的问题:是的。您需要做的就是将 shippingDetails 添加到 test["cardholder"] 字典中:

var test: [String:[String:[String:String]]] = ["cardholder": ["address": addressDetails, "shipping_address": shippingDetails]]

但是,我完全同意@Paulw11 的观点,你不应该fiddle那样处理字典。使用符合 Codable 的结构:

struct Address: Codable {
    var city: String
    var state: String
    var street: String
    var zipCode: String
    var unit: String?
    
    enum CodingKeys: String, CodingKey {
        case city, state, street, zipCode = "zip_code", unit
    }
}

struct Cardholder: Codable {
    var address: Address
    var shippingAddress: Address
    
    enum CodingKeys: String, CodingKey {
        case address, shippingAddress = "shipping_address"
    }
}

struct Payload: Codable {
    var cardholder: Cardholder
}


...

let addressDetails = Address(city: self.newCity!, state: self.newState!, street: self.newStreet!, zipCode: self.newZipcode!, unit: self.newUnit == "" ? nil : self.newUnit)
let shippingDetails = Address(city: self.newCity!, state: self.newState!, street: self.newStreet!, zipCode: self.newZipcode!, unit: self.newUnit == "" ? nil : self.newUnit)
var test = Payload(cardholder: Cardholder(address: addressDetails, shippingAddress: shippingDetails))