You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:05:53