我正在尝试使用Decodable,但出现此错误,无法弄清原因:无法将类型为“字符串”的值转换为预期的参数类型为“数据”
这是我的代码:
struct JSONResponse : Decodable {
var places :[Place]
}
struct Place : Decodable {
var name :String
var latitude :Double
var longitude :Double
}
let json = """
{
"places":[
{
"name" : "San Diego",
"latitude" : 32.71,
"longitude" : -117.16
},
{
"name" : "Los Angeles",
"latitude" : 34.05,
"longitude" : -118.24
}
]
}
"""
let placesResponse = try!
JSONDecoder().decode(JSONResponse.self, from: json)
print(placesResponse.places)
答案 0 :(得分:1)
为了将String
转换为Data
类型,您需要调用.data
并通过设置String
参数来设置using
实例属性,例如这个:
""".data(using: .utf8)! // added code
let placesResponse = try! JSONDecoder().decode(JSONResponse.self, from: json)
print(placesResponse.places)
答案 1 :(得分:0)
这是因为.decode
函数接受Data
而不是String
的参数
只需将JSON
转换为Data
JSONDecoder().decode(JSONResponse.self, from: json.data(using: .utf8)!)
答案 2 :(得分:0)
您需要在.data(using: .utf8)
之后添加String
才能将其转换为Data
,因为from
参数需要Data
类型的对象。
因此您的代码将如下所示:
let json = """
{
"places":[
{
"name" : "San Diego",
"latitude" : 32.71,
"longitude" : -117.16
},
{
"name" : "Los Angeles",
"latitude" : 34.05,
"longitude" : -118.24
}
]
}
""".data(using: .utf8)
这里更重要的一点是,您应该使用do catch
块,这样就可以处理错误,如下所示:
do {
let placesResponse = try JSONDecoder().decode(JSONResponse.self, from: json)
print(placesResponse.places)
} catch {
print(error)
}