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

iOS报错:无法将String类型转换为预期的Data类型

解决JSON解码的两个关键问题

你遇到的错误主要有两个核心原因,咱们一步步来修正:

1. 字符串转Data的类型不匹配问题

JSONDecoder.decode(_:from:)方法要求第二个参数是Data类型,但你直接传入了String,这就触发了"Cannot convert value of type 'String' to expected argument type 'Data'"的错误。解决方法很简单,把字符串转成UTF-8编码的Data即可,注意要处理可选值避免nil崩溃。

2. JSON结构与解码目标类型不匹配

你的JSON数据是数组格式(开头是[),但你尝试解码成单个DatabaseObject对象,就算解决了Data的问题,后续也会抛出解码错误。需要把解码目标改成[DatabaseObject].self(即对象数组类型)。

修正后的完整代码

struct DatabaseObject: Decodable{
    var CityNameL = ""
    var DBName = ""
    var DBNameID = 0
    var IDName = ""
}

func jsonToObject(json: String){
    do{
        // 第一步:将字符串转换为Data
        guard let jsonData = json.data(using: .utf8) else {
            print("无法将字符串转换为Data格式")
            return
        }
        // 第二步:解码为对象数组
        let databases = try JSONDecoder().decode([DatabaseObject].self, from: jsonData)
        // 解码成功后可以正常操作数组
        print("解码成功,共获取\(databases.count)个数据库对象")
        for db in databases {
            print("城市名称:\(db.CityNameL),数据库名:\(db.DBName)")
        }
    } catch let jsonErr {
        print("解码失败:\(jsonErr.localizedDescription)")
    }
}

额外小提示

如果你的JSON字段名和结构体属性名完全一致,其实可以省略结构体里的默认值(保留也不影响),Swift的Decodable会自动完成字段匹配:

struct DatabaseObject: Decodable {
    var CityNameL: String
    var DBName: String
    var DBNameID: Int
    var IDName: String
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:42:19