SwiftUI出现Value of type '[Tickets]' has no member 'open_tickets'错误如何解决
问题原因
错误的核心是RootO结构体的字段类型和JSON结构不匹配:
你给出的JSON中根节点下的tickets是对象类型,内部包含open_tickets、closed_tickets两个子字段,但你在定义RootO时把tickets声明为了[Tickets](Tickets数组类型)。数组类型本身没有open_tickets成员,只有单个Tickets类型才有该属性,所以编译时会抛出对应错误。
此外还有一个隐藏的解析错误:你定义的Open_Tickets结构体只声明了ticket_number字段,但实际JSON里open_tickets的元素不存在该字段,只包含uuid、package等字段,类型不对齐会导致后续运行时解析失败。
修复方案
按照JSON结构修正所有Codable结构体的定义即可,修改后的完整代码如下:
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 { // 现在tickets是对象类型,可以直接调用open_tickets self.ticket = res.tickets.open_tickets } }else { print("No Data") } } catch { print (error) } }.resume() } } // 修正RootO的tickets类型,从数组改成单个Tickets对象 struct RootO: Codable { let status: String let tickets: Tickets enum CodingKeys: String, CodingKey { case status, tickets } } struct Tickets: Codable { let open_tickets: [Open_Tickets] let closed_tickets: [Open_Tickets] // 可选补全closed_tickets字段 enum CodingKeys: String, CodingKey { case open_tickets, closed_tickets } } // 修正Open_Tickets字段,和JSON结构对齐 struct Open_Tickets: Codable{ let uuid: String let package: TicketPackage enum CodingKeys: String, CodingKey { case uuid, package } } // 补全嵌套的Package、Buyer、BuyerProfile结构体 struct TicketPackage: Codable { let title: String let buyer: Buyer enum CodingKeys: String, CodingKey { case title, buyer } } struct Buyer: Codable { let name: String let family_name: String? let email: String let buyer_profile: BuyerProfile enum CodingKeys: String, CodingKey { case name, family_name, email, buyer_profile } } struct BuyerProfile: Codable { let telephone: String enum CodingKeys: String, CodingKey { case telephone } }
内容的提问来源于stack exchange,提问作者drago
相关产品推荐
相关产品推荐

