【问题标题】:Creating nested dictionary for JSON为 JSON 创建嵌套字典
【发布时间】:2021-06-02 12:45:27
【问题描述】:

我正在尝试为 POST 请求复制 json 格式,但在 Swift 中使用以下 2D 字典时遇到问题。

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]]

【问题讨论】:

  • 在使用 JSON 和 Swift 时,您应该始终尝试使用带有适当结构的 Codable。它比尝试使用原始容器更简单、更可靠
  • shipping_addresscardholder 的属性 - 您需要将该键/值添加到与 cardholder 关联的字典中

标签: ios json swift dictionary mobile


【解决方案1】:

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

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

不过,我完全同意@Paulw11 的观点,你不应该那样摆弄字典。改用符合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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2021-04-04
    • 2022-07-02
    • 1970-01-01
    • 2018-11-09
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多