ynizhenie
@ynizhenie

Как правильно сделать структуру?

Добрый день начал потихоньку изучать Swift.
Столкнулся с такой проблемой , есть массив.
Массив
[
  {
"invoiceNumber": "FV/MON/X/369",
"date": "2019-06-01 00:00:00",
"dueDate": "2019-06-01 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/368",
"date": "2019-06-01 00:00:00",
"dueDate": "2019-06-01 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/367",
"date": "2019-06-01 00:00:00",
"dueDate": "2019-06-01 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/366",
"date": "2019-06-01 00:00:00",
"dueDate": "2019-06-01 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/363",
"date": "2019-05-04 00:00:00",
"dueDate": "2019-05-04 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/362",
"date": "2019-05-04 00:00:00",
"dueDate": "2019-05-04 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/361",
"date": "2019-05-04 00:00:00",
"dueDate": "2019-05-04 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
},
  {
"invoiceNumber": "FV/MON/X/360",
"date": "2019-05-04 00:00:00",
"dueDate": "2019-05-04 00:00:00",
"overdue": true,
"valueNoTax": 100,
"valueWithTax": 123,
"valueToPay": 123
}
],

Его получаю через:
Вызов
let response = "ссылка"
guard let url = URL(string: response) else {return}
URLSession.shared.dataTask(with: url) { (data, respnseData, error) in
            
            guard let jsondata = data else {return}
            do {
                let decoder = JSONDecoder()
                let Values = try decoder.decode([FakturyObject].self, from: jsondata)
                self.FLD = Values
                print("CURRENT ARRAYS")
                print(self.FLD)
            }catch let error{
                print("BAD CONNECTION" , error)
            }
            
            }.resume()

Структура выглядит так:
Структура

struct FakturyObject: Decodable{
        var date: String?
        var dueDate: String?
        var invoiceNumber: String?
        var overdue: Int?
        var valueNoTax: Int?
        var valueToPay: Int?
        var valueWithTax: Int?
}


Ошибка:
Error

BAD CONNECTION
keyNotFound(CodingKeys(stringValue: "intValue", intValue: nil),
Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)]


Он ожидает ключи верхнего массива. Как добраться до элементов внутри?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
doublench21
@doublench21 Куратор тега Swift
Простой пример:

2ffZng2.png

Код
let json = """
    [{
    "invoiceNumber": "FV/MON/X/369",
    "date": "2019-06-01 00:00:00",
    "dueDate": "2019-06-01 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/368",
    "date": "2019-06-01 00:00:00",
    "dueDate": "2019-06-01 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/367",
    "date": "2019-06-01 00:00:00",
    "dueDate": "2019-06-01 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/366",
    "date": "2019-06-01 00:00:00",
    "dueDate": "2019-06-01 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/363",
    "date": "2019-05-04 00:00:00",
    "dueDate": "2019-05-04 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/362",
    "date": "2019-05-04 00:00:00",
    "dueDate": "2019-05-04 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/361",
    "date": "2019-05-04 00:00:00",
    "dueDate": "2019-05-04 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    },
    {
    "invoiceNumber": "FV/MON/X/360",
    "date": "2019-05-04 00:00:00",
    "dueDate": "2019-05-04 00:00:00",
    "overdue": true,
    "valueNoTax": 100,
    "valueWithTax": 123,
    "valueToPay": 123
    }]
    """

    struct FakturyObject: Decodable {
      let date: String
      let dueDate: String
      let invoiceNumber: String
      let overdue: Bool // <---- ОШИБКА БЫЛА ТУТ! 
      let valueNoTax: Int
      let valueToPay: Int
      let valueWithTax: Int
    }

    let data = json.data(using: .utf8)
    let decoder = JSONDecoder()
    let parsedData = try! decoder.decode([FakturyObject].self, from: data!)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
briahas
@briahas
ObjC, Swift, Python
Надо отсылать правильный джейсон - надо чтоб у массива было имя. А у вас - мало того что массив вместо дикшионари, так еще и внутри безымянный массив элементов. Если не можете отсылать правильный джейсон - тогда делайте собственный парсер
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы