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

Swift4报错NSCocoaErrorDomain Code=4865:JSON转User类失败求助

解决JSON数组解析到User类的NSCocoaErrorDomain 4865错误

你猜的没错!这个NSCocoaErrorDomain Code=4865错误几乎可以肯定是因为HTTP接口返回的是JSON数组格式(比如[{"userid": "123", "name": "Josh"}, ...]),但你的解析逻辑是按照单个JSON对象来映射到User类的,导致解析器找不到顶层的userid键。下面是具体的解决步骤:

第一步:先确认响应的JSON结构

先把接口返回的完整数据打印出来,验证是不是数组格式。比如在iOS里可以这么做:

if let responseData = data {
    if let jsonStr = String(data: responseData, encoding: .utf8) {
        print("接口返回JSON: \(jsonStr)")
    }
}

如果输出是包裹在[]里的数组结构,那就能100%确定问题根源了。

第二步:调整解析逻辑,先解析数组再取User对象

假设你用的是iOS常用的Codable协议,你的User类应该是类似这样的:

class User: Codable {
    var userid: String?
    var name: String?
    // 其他需要映射的属性...
}

之前出错的代码应该是直接尝试把数据解析成单个User对象:

// 错误写法:把数组当成单个对象解析
do {
    let user = try JSONDecoder().decode(User.self, from: responseData)
} catch {
    print(error) // 就是你遇到的那个错误
}

正确的做法是先解析成[User]类型的数组,再从中取出你需要的元素(如果接口是返回单个用户数据,数组里应该只有一个元素):

// 正确写法:先解析数组
do {
    let userArray = try JSONDecoder().decode([User].self, from: responseData)
    // 取出第一个用户对象(根据业务需求调整,比如遍历数组处理多个用户)
    if let targetUser = userArray.first {
        // 拿到User对象后,就可以执行SQL插入了
        insertUserToDB(user: targetUser)
    }
} catch {
    print("解析失败: \(error.localizedDescription)")
}

第三步:完善SQL插入逻辑

拿到User对象后,用类变量插入数据库时,要确保属性和数据库字段一一对应。这里以SQLite(用FMDB库)为例,给你个参考:

func insertUserToDB(user: User) {
    guard let userid = user.userid, let userName = user.name else {
        print("用户数据不完整,无法插入")
        return
    }
    
    let db = FMDatabase(path: "你的数据库文件路径")
    guard db.open() else {
        print("数据库打开失败: \(db.lastErrorMessage())")
        return
    }
    
    // 用参数化查询避免SQL注入,千万别直接拼接字符串!
    let isSuccess = db.executeUpdate(
        "INSERT INTO users (userid, name) VALUES (?, ?)",
        withArgumentsIn: [userid, userName]
    )
    
    if isSuccess {
        print("用户数据插入成功")
    } else {
        print("插入失败: \(db.lastErrorMessage())")
    }
    db.close()
}

额外排查小提示

如果确认接口返回的是单个JSON对象但还是报错,那要检查:

  • User类的CodingKeys有没有拼写错误(比如把userid写成userId)
  • 接口返回的userid字段是不是真的存在,有没有大小写不一致的情况

内容的提问来源于stack exchange,提问作者Josh Mustafa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:36:53