Как парсить JSON если ключи от API цифры

parse
swift5
json
xcode

#1
import UIKit

class ViewController: UIViewController {

struct allTicket: Decodable {
    var order: String?
    var totalcount: Int?
    var data: [ArrTicket]?
    
    enum CodingKeys: String, CodingKey {
        case order
        case totalcount
        case data
    }
}


struct ArrTicket: Decodable {
    var id: Int?
    var name: String?
    var lastDate: String?
    var createDate: String?
    var usersIdRecipient: Int?
    var usersIdOvner: Int?
    var category: String?
    var groupEngineer: String?
    
    enum CodingKeys: Int, CodingKey {
        case id = 2
        case name = 1
        case lastDate = 19
        case createDate = 15
        case usersIdRecipient = 4
        case usersIdOvner = 5
        case category = 7
        case groupEngineer = 8
    }
}
@IBAction func getRequest(_ sender: Any) {
    
    guard let url = URL(string: "http://glpi.nekrasovka.ru/apirest.php/search/Ticket?sort=2&order=DESC&range=0-100&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=2") else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("nf8esvcsjaas61q10k9mu2nu92", forHTTPHeaderField: "Session-Token")
    
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        
        guard let response = response, let data = data else { return }
        
        print(response)
        print(data)
        
        do {
            
            let decoder = JSONDecoder()
            let article = try? decoder.decode(allTicket.self, from: data)
            print(article?.data)
        } catch {
            print(error)
        }
    }.resume()
}

}
Пробовал указывать ключи как цифры с значение String, в таком случае JSON вообще не извлекался, подскажите что я делаю не так, ниже ответ от сервера.

{
“totalcount”: 32,
“count”: 32,
“sort”: 2,
“order”: “DESC”,
“data”: [
{
“2”: 2263,
“1”: “Переименовать ПРД”,
“12”: 2,
“19”: “2019-12-17 17:35:01”,
“15”: “2019-12-17 17:34:13”,
“4”: 172,
“5”: 56,
“7”: 34,
“8”: “ОИТ > ИТ поддержка”
}
],
“content-range”: “0-31/32”
}


#2

попробуйте использовать не int а string


#3

Пробовал, в таком случае let decoder = JSONDecoder() let article = try? decoder.decode(allTicket.self, from: data)
вообще не извлекает его


#4

А что изменили? значения у енума?

КИньте урл, если это не сверхсекретное апи))


#5
let json = """
{
    "totalcount": 32,
    "count": 32,
    "sort": 2,
    "order": "DESC",
    "data": [
        {
            "2": 2263,
            "1": "Переименовать ПРД",
            "12": 2,
            "19": "2019-12-17 17:35:01",
            "15": "2019-12-17 17:34:13",
            "4": 172,
            "5": 56,
            "7": 34,
            "8": "ОИТ > ИТ поддержка"
        }
    ],
    "content-range": "0-31/32"
}
"""

struct AllTicket: Decodable {
    var order: String?,
    totalcount: Int?,
    data: [ArrTicket]?
}

struct ArrTicket: Decodable {
    var id: Int?,
    name: String?,
    lastDate: String?,
    createDate: String?,
    usersIdRecipient: Int?,
    usersIdOvner: Int?,
    category: Int?,
    groupEngineer: String?
    
    private enum CodingKeys: String, CodingKey {
        case id = "2",name = "1",lastDate = "19",createDate = "15",usersIdRecipient = "4",usersIdOvner = "5",category = "7", groupEngineer = "8"
    }
}

let allTicket = try JSONDecoder().decode(AllTicket.self, from: json.data(using: .utf8)!)
print(allTicket)

#6

Урл в коде, но токен просрачивается, это сервак личный, нужно построить функционал который не может встроенная веб оболочка, ну и мобилизировать.
JSON отдает nil каждому элементу структуры arrTiket, если структура стринг то JSON вообще не извлекается


#7

попробую завтра, спасибо большое за помощь


#8

не работает, попробовал Ваш вариант


#9

Покажите json на котором не работает.


#10

Решил таким способом
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decodeIfPresent(Int.self, forKey: .id)
name = try container.decodeIfPresent(String.self, forKey: .name)
lastDate = try container.decodeIfPresent(String.self, forKey: .lastDate)
createDate = try container.decodeIfPresent(String.self, forKey: .createDate)
usersIdRecipient = try container.decodeIfPresent(Int.self, forKey: .usersIdRecipient)

    if let usersIdOvner = try? container.decodeIfPresent(Int.self, forKey: .usersIdOvner) {
        self.usersIdOvner = usersIdOvner
    }
    category = try container.decodeIfPresent(String.self, forKey: .category)
    groupEngineer = try container.decodeIfPresent(String.self, forKey: .groupEngineer)
}