不能从Swift中解析的JSON中提取所有的值。

问题描述 投票:0回答: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
                }
            }
        }
    ]
}

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

json swift parsing
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 在这种情况下,但我对您的用例了解不够,无法提出适当的建议)

© www.soinside.com 2019 - 2024. All rights reserved.