Как разобрать JSON с помощью Decodable?

когда я пытаюсь разобрать свой json с декодируемым днем ​​​​рождения, приходит ноль. Какой формат даты я должен использовать любой совет или образец кода, пожалуйста. мой формат даты включает часовой пояс.

Моя проблема в том, что дата рождения равна нулю. Как разобрать дату рождения с декодируемым?

Мой json:

{
    "id": 1,
    "name": "fatih",
    "birddate": "2018-09-19T11:36:00.4033163+03:00",
    "total": 0.9,
    "isTest": false
}

вот моя структура:

struct TestDTO : Decodable {
    var id:Int?
    var name : String?
    var birtdate : Date?
    var total : Double?
    var isTest : Bool?
}

RestClientServiceTest().CallRestService(matching: cmd, completion: { (data) in
            do{

                let decoder = JSONDecoder()
                decoder.dateDecodingStrategy = .formatted(dateFormatter)
                let stories = try decoder.decode(TestDTO.self, from: data!)
                print(data)
            }catch let error{
                print("Json Parse Error : \(error)")
            }
        })

person cartoonworld    schedule 19.09.2018    source источник
comment
Правописание!!: birthday != birddate != birtdate   -  person vadian    schedule 19.09.2018
comment
Я предлагаю вам проанализировать дату рождения как строку и добавить один метод экземпляра, который преобразует дату строки в дату   -  person SPatel    schedule 19.09.2018
comment
Возможно yyyy-MM-dd'T'HH:mm:ss.SZ   -  person MadProgrammer    schedule 19.09.2018
comment
@MadProgrammer Определенно не YYYY-mm-DD и не yyyy-mm-dd   -  person vadian    schedule 19.09.2018
comment
@vadian Я иду спать   -  person MadProgrammer    schedule 19.09.2018
comment
Можете ли вы добавить к вопросу код инициализации dateFormatter? Это необходимо для решения вашей проблемы.   -  person user28434'mstep    schedule 19.09.2018


Ответы (2)


Итак, поиграем на детской площадке...

let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
let value = "2018-09-19T11:36:00.4033163+03:00"
print(format.date(from: value))

Печатает 2018-09-19 08:36:00 +0000

Так что делайте прыжок дальше...

let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"

let text = """
{
"id": 1,
"name": "fatih",
"birddate": "2018-09-19T11:36:00.4033163+03:00",
"total": 0.9,
"isTest": false
}
"""

struct TestDTO : Decodable {
    var id:Int?
    var name : String?
    var birddate : Date?
    var total : Double?
    var isTest : Bool?
}

do{
    let jsonData = text.data(using: .utf8)
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(format)
    let stories = try decoder.decode(TestDTO.self, from: jsonData!)
    print(stories)
}catch let error{
    print("Json Parse Error : \(error)")
}

печатает...

TestDTO(id: Optional(1), name: Optional("fatih"), birddate: Optional(2018-09-19 08:36:00 +0000), total: Optional(0.9), isTest: Optional(false))

Возможно, вы найдете Easy Skeezy Date Formatting for Swift полезным

person MadProgrammer    schedule 19.09.2018
comment
Можете ли вы также использовать birthdate вместо birddate (что бы это ни было)? - person user28434'mstep; 19.09.2018
comment
@user28434 user28434 Вы можете использовать все, что хотите, я просто взял то, что было дано, и заставил это работать - устал делать предположения, извините - person MadProgrammer; 19.09.2018
comment
Ну, как заметил @vadian, вопрос использует 3 разные формы, только birthdate выглядит как-то. - person user28434'mstep; 19.09.2018
comment
@user28434 user28434 Ваши замечания верны, но я просто сосредоточился на том, чтобы заставить формат даты работать — OP нужно будет исправить любые другие несоответствия — я понимаю, что это, вероятно, будет раздражать некоторых людей, примерно так же, как люди, представляющие значения даты / времени как строки в коде для меня - person MadProgrammer; 19.09.2018

  1. Прежде всего, имя, которое вы использовали в struct, неверно birddate - ошибка опечатки.
  2. Во-вторых, не устанавливайте его как Date, это String.

Получите данные как String и при их использовании используйте NSDateFormatter.

Вы можете искать NSDateFormatter на SO.

person Amit    schedule 19.09.2018
comment
Он Date представлен как String, JSONDecoder.DateDecodingStrategy.formatted().iso8601) именно для этого и существуют. Чтобы вы не делали это вручную. - person user28434'mstep; 19.09.2018
comment
@ user28434: об этом я не знал. Я использовал NSDateFormatter. Спасибо. Должен ли я удалить свой ответ? - person Amit; 19.09.2018