Быстрый кодируемый массив объектов - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь отобразить структуру 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 фигурных скобок?

Примечание : Нет, я не могу изменить службу для принятия лучшего формата, имеющего дело с устаревшей службой.

1 Ответ

0 голосов
/ 16 февраля 2020

Структуры правильные

Я думаю, проблема в том, как вы заполняете свои структуры (не показано в вашем вопросе).

Ошибка

Это неправильный код, который я предполагаю , который вы используете.

В частности, ошибка заключается в способе заполнения значения dictionaries. Фактически вы создаете массив с одним словарем, имеющим все значения. Вместо этого вы должны создать массив словарей, в котором каждый словарь имеет одну отдельную запись.

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

Исправление

Как сказано выше, давайте попробуем поместить по одной отдельной записи в каждый словарь. .

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"}]}}
...