【问题标题】:Swift Encodable Array of ObjectsSwift 可编码对象数组
【发布时间】:2020-05-31 18:46:16
【问题描述】:

我正在尝试将 Swift Encodable 结构呈现为以下 JSON:

{
   "userID": 1000142,
   "emergencyContactData": {"contact": 
       [
           {"firstName": "John"}, 
           {"lastName": "Doe"},
           {"email": "john.doe567@gmail.com"}, 
           {"phone": "12345678901"}
       ]
   }
}

我尝试了以下方法:

struct UserEmergencyContactRequest: Encodable {
    var userID: String
    var ecData: EmergencyContactData
}

struct EmergencyContactData: Encodable {
    var contact: [[String: String]]
}

但是,单个 String:String 字典条目不会呈现到 JSON 对象(没有花括号)。如何更改 [String: String] 条目,以便在将其呈现为 JSON 结构时,单个 String: String 值将包含在一组 JSON 花括号中?

注意:不,我无法更改服务以接受更好的格式,处理旧服务。

【问题讨论】:

    标签: json swift encode


    【解决方案1】:

    结构正确

    我认为问题在于您填充结构的方式(未在您的问题中显示)。

    错误

    这是我猜你使用的错误代码。

    具体而言,错误在于您填充 dictionaries 值的方式。事实上,您正在创建一个数组,其中包含一个包含所有值的字典。相反,您应该创建一个字典数组,其中每个字典都有 1 个条目。

    let dictionaries = [["firstName" : "John", "lastName": "Doe", "email": "john.doe567@gmail.com", "phone": "12345678901"]]
    let ecData = EmergencyContactData(contact: dictionaries)
    let elm = UserEmergencyContactRequest(userID: "userID", ecData: ecData)
    
    if
        let data = try? JSONEncoder().encode(elm),
        let string = String(data: data, encoding: .utf8) {
        print(string)
    }
    
    
    {"userID":"userID","ecData":{"contact":[{"email":"john.doe567@gmail.com","firstName":"John","lastName":"Doe","phone":"12345678901"}]}}
    

    修复

    如上所述,让我们尝试将 1 个条目放入每个字典中。

    let dictionaries = [["firstName" : "John"], ["lastName": "Doe"], ["email": "john.doe567@gmail.com"], ["phone": "12345678901"]]
    
    let ecData = EmergencyContactData(contact: dictionaries)
    let elm = UserEmergencyContactRequest(userID: "userID", ecData: ecData)
    
    if  let data = try? JSONEncoder().encode(elm),
        let string = String(data: data, encoding: .utf8) {
        print(string)
    }
    

    现在我们得到了预期的结果。

    {"userID":"userID","ecData":{"contact":[{"firstName":"John"},{"lastName":"Doe"},{"email":"john.doe567@gmail.com"},{"phone":"12345678901"}]}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多