我已经为此苦苦挣扎了多年,但我不明白为什么我根本无法通过它。
我有一个看起来像这样的数组:
{
"status": "OK",
"tickets": {
"open_tickets": [
{
"uuid": "XXXXXXX",
"package": {
"title": "XXXX",
"buyer": {
"name": "XXX",
"family_name": null,
"email": "XXXXX",
"buyer_profile": {
"telephone": "5435345"
}
}
}
}
],
"closed_tickets": []
}
}
我正在尝试访问嵌套数组。具体来说,open_tickets
。
所以,我试过了:
我已将其置于结构和主体之间的视图顶部:
@ObservedObject var fetcherL = FetcherL()
现在我尝试从远程 URL 读取数据:
public class FetcherL: ObservableObject {
@Published var ticket = [Open_Tickets]()
init(){
load()
}
func load() {
let url = URL(string: "HTTPS://xxxxxxx")
var request = URLRequest(url: url!)
URLSession.shared.dataTask(with: request) {(data,response,error) in
do {
if let d = data {
let res = try JSONDecoder().decode(RootO.self, from: d)
DispatchQueue.main.async {
//self.ticket = res.tickets.open_tickets
self.ticket = res.tickets.open_tickets
}
}else {
print("No Data")
}
} catch {
print (error)
}
}.resume()
}
}
struct RootO: Codable {
let tickets: [Tickets]
enum CodingKeys: String, CodingKey {
case tickets = "tickets"
}
}
struct Tickets: Codable {
let open_tickets: [Open_Tickets]
enum CodingKeys: String, CodingKey {
case open_tickets = "open_tickets"
}
}
struct Open_Tickets: Codable{
let ticket_number: String
enum CodingKeys: String, CodingKey {
case ticket_number = "ticket_number"
}
}
但是这段代码给出了这个错误并阻止我编译我的应用程序:
Value of type '[Tickets]' has no member 'open_tickets'
有人可以就此提出建议吗?
答案 0 :(得分:1)
您收到错误的原因在于您的 Root0:
struct RootO: Codable {
let tickets: [Tickets]
enum CodingKeys: String, CodingKey {
case tickets = "tickets"
}
}
您希望您的 Root0 有一个名为 tickets 的字段,需要一个 Tickets 数组,但是响应的 tickets 属性是一个[String: [Tickets]
这是一个可行的解决方案:
let json = """
{
"status": "OK",
"tickets": {
"open_tickets": [
{
"uuid": "XXXXXXX",
"package": {
"title": "XXXX",
"buyer": {
"name": "XXX",
"family_name": null,
"email": "XXXXX",
"buyer_profile": {
"telephone": "5435345"
}
}
}
}
],
"closed_tickets": []
}
}
""".data(using: .utf8)!
struct RootO: Codable {
let tickets: [String: [Ticket]]
var openTickets: [Ticket] {
if let data = tickets["open_tickets"] {
return data
} else {
return []
}
}
var closedTickets: [Ticket] {
if let data = tickets["closed_tickets"] {
return data
} else {
return []
}
}
}
struct Ticket: Codable {
let ticketNumber: String
enum CodingKeys: String, CodingKey {
case ticketNumber = "uuid"
}
}
let decoder = JSONDecoder()
let decoded = try! decoder.decode(RootO.self, from: json)
print("Open tickets = \(decoded.openTickets.count)")
print("Closed tickets = \(decoded.closedTickets.count)")
答案 1 :(得分:0)
改变RootO结构试试看,“tickets”是对象而不是数组
struct RootO: Codable {
let tickets: Tickets
enum CodingKeys: String, CodingKey {
case tickets = "tickets"
}
}