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
相关产品推荐
相关产品推荐

