Невозможно извлечь все значения из проанализированного JSON в Swift - PullRequest
1 голос
/ 23 апреля 2020

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

struct EfectivO: Codable {        
   public var counted: Int
   public var registered: Int
}

struct TotalsByPaymentType: Codable {
  public var Efectivo: EfectivO
}

struct Results: Codable {
    var locale: String
    var date: String
    var totalsByPaymentType: TotalsByPaymentType
}

struct Loan: Codable {
  var results: [Results]
  var petitions: [Loan] = []
}


do {
   let courses = try JSONDecoder().decode(Loan.self, from: data)
   for item in courses.results {
     self.petitions.append(courses.self)
     print(item)
   }
   return
 } catch let jsonErr {
    print("Error serializing json:", jsonErr)
    return
 }

Я не отправляю необработанные JSON, но я вижу, что там правильный ответ. Это действительно JSON:

{
    "results": [
        {
            "locale": "GB",
            "date": "2020-01-29",
            "totalsByPaymentType": {
                "Efectivo": {
                    "counted": 108130,
                    "registered": 106135
                },
                "Tarjeta de Credito": {
                    "counted": 209720,
                    "registered": 209720
                },
                "Cheque Gourmet": {
                    "counted": 1800,
                    "registered": 1800
                },
                "Ticket Restaurantes": {
                    "counted": 3800,
                    "registered": 3800
                },
                "Resto-In": {
                    "counted": 0,
                    "registered": 0
                },
                "Sodexo": {
                    "counted": 1921,
                    "registered": 1921
                },
                "Friend": {
                    "counted": 0,
                    "registered": 0
                }
            }
        }
    ]
}

Как может показаться, это очень сложная структура, и у меня хороший ответ.

1 Ответ

2 голосов
/ 23 апреля 2020

У root есть только один массив, который [Loan]

- получается, что не , что у вас есть. Ваш JSON является объектом верхнего уровня с одним свойством results, которое содержит массив объектов. Кроме того, структура данных не выглядит рекурсивной, как предполагает модель данных в вашем вопросе.

Учитывая пример JSON, вы можете либо явно назвать каждое из результатов, например, так:

struct Results: Codable {
    let results: [Result]
}

struct Result: Codable {
    let locale, date: String
    let totalsByPaymentType: TotalsByPaymentType
}

struct TotalsByPaymentType: Codable {
    let efectivo, tarjetaDeCredito, chequeGourmet, ticketRestaurantes,
        restoIn, sodexo, friend: Total

    enum CodingKeys: String, CodingKey {
        case efectivo = "Efectivo"
        case tarjetaDeCredito = "Tarjeta de Credito"
        case chequeGourmet = "Cheque Gourmet"
        case ticketRestaurantes = "Ticket Restaurantes"
        case restoIn = "Resto-In"
        case sodexo = "Sodexo"
        case friend = "Friend"
    }
}

struct Total: Codable {
    let counted, registered: Int
}

или соберите все суммы платежей в словаре:

struct Results: Codable {
    let results: [Result]
}

struct Result: Codable {
    let locale, date: String
    let totalsByPaymentType: [String: Total]
}

Какой подход использовать, зависит от того, как динамически c изменяются значения «типов платежей». Это фиксированный список? Тогда go для свойств. Меняется ли это каждые пару недель или месяцев? Затем используйте словарь.

В любом случае вы анализируете это, используя

do {
  let results = try JSONDecoder().decode(Results.self, from: data)
  for result in results.results {
    // handle each result
  }
} catch {
    print(error)
}

(NB. В этом случае вам, вероятно, следует избегать обобщенных c имен, таких как Result, но я не недостаточно хорошо понимаю ваш вариант использования, чтобы сделать соответствующие предложения)

...