Swift开发:调用JSONSerialization.jsonObject无匹配项及JSON解析器实现求助
Swift JSON解析报错:No exact matches in call to class method 'jsonObject'
我是Swift新手,尝试通过扩展结合JSONSerialization编写JSON解析器。想要实现一个解析JSON文件的函数,同时在同一个扩展中实现生成JSON的计算属性,但调用JSONSerialization.jsonObject方法时出现错误:"No exact matches in call to class method 'jsonObject'"。
以下是我的代码:
// Model struct Todoitem { let id = { return UUID().uuidString }() let text : String let importance : Importance let deadline : Date? } enum Importance { case usual, important, unimportant } //Parser extension Todoitem { static func parse(json : Any) -> Todoitem? { if let file = try? JSONSerialization.jsonObject(with: json) as? [String : Any] { } return nil } }
问题原因
JSONSerialization.jsonObject(with:)方法要求的参数是Data类型,你传入的Any类型不匹配,这是编译器报错的直接原因。另外代码还存在几个后续会导致解析失败的问题:
- 枚举
Importance没有实现JSON编解码的转换逻辑 Date类型需要指定转换格式才能在JSON中正确存储和解析- 当前解析函数没有从字典中提取字段并转换为
Todoitem属性的逻辑
修复后的完整代码
// Model struct Todoitem { let id = UUID().uuidString let text: String let importance: Importance let deadline: Date? } enum Importance: String, Codable { case usual, important, unimportant } // Parser 扩展 extension Todoitem { // 解析JSON Data 为 Todoitem static func parse(from data: Data) -> Todoitem? { do { // 将Data转为字典 guard let jsonDict = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { return nil } // 提取必填的text字段 guard let text = jsonDict["text"] as? String else { return nil } // 处理Importance枚举的转换 guard let importanceRaw = jsonDict["importance"] as? String, let importance = Importance(rawValue: importanceRaw) else { return nil } // 处理可选的deadline日期(用时间戳转换) let deadline: Date? if let timestamp = jsonDict["deadline"] as? TimeInterval { deadline = Date(timeIntervalSince1970: timestamp) } else { deadline = nil } // id是自动生成的,无需从JSON解析 return Todoitem(text: text, importance: importance, deadline: deadline) } catch { print("解析错误:\(error)") return nil } } // 生成JSON Data的计算属性 var jsonData: Data? { var jsonDict: [String: Any] = [ "id": id, "text": text, "importance": importance.rawValue ] // 可选日期转为时间戳加入字典 if let deadline = deadline { jsonDict["deadline"] = deadline.timeIntervalSince1970 } do { return try JSONSerialization.data(withJSONObject: jsonDict, options: .prettyPrinted) } catch { print("生成JSON错误:\(error)") return nil } } }
关键修复点说明
- 把解析函数的参数从
Any改为Data,匹配JSONSerialization.jsonObject(with:)的参数要求 - 让
Importance枚举遵循String和Codable协议,直接通过原始值实现JSON字符串和枚举值的转换 - 解析时逐个校验字段类型,避免类型转换失败导致的崩溃
- 添加了生成JSON的计算属性
jsonData,完成Todoitem到JSON数据的反向转换 - 用时间戳处理
Date类型的JSON存储,保证跨平台兼容性
内容的提问来源于stack exchange,提问作者aLikan
相关产品推荐
相关产品推荐

