1

似乎我无法从 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
                }
            }
        }
    ]
}

正如你所看到的,它的结构非常复杂,我有一个很好的回应。

4

1 回答 1

2

根只有一个数组,即 [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]
}

使用哪种方法取决于“支付类型”值变化的动态程度。是固定名单吗?然后去找房产。是每两周或几个月更换一次吗?然后使用字典。

无论如何,您使用

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

(注意,在这种情况下,您可能应该避免使用通用名称Result,但我不太了解您的用例,无法提出适当的建议)

于 2020-04-23T20:57:40.790 回答