对JSON使用Decodable时出现错误-Swift

时间:2019-03-13 14:49:43

标签: json swift decodable

我正在尝试使用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)

3 个答案:

答案 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)
}