Получение ошибки при использовании Decodable для JSON - Swift - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь использовать Decodable, но получаю эту ошибку и не могу понять, почему: Невозможно преобразовать значение типа 'String' в ожидаемый тип аргумента 'Data'

Вот мой код:

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 ]

1 голос
/ 13 марта 2019

Чтобы преобразовать String в тип Data, вам нужно вызвать .data и установить свойство экземпляра String, установив параметр using следующим образом:

""".data(using: .utf8)!  // added code

let placesResponse = try! JSONDecoder().decode(JSONResponse.self, from: json)
print(placesResponse.places)
0 голосов
/ 13 марта 2019

Вам нужно добавить .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)
}
0 голосов
/ 13 марта 2019

Это потому, что функция .decode принимает аргумент Data, а не String, поэтому просто конвертируйте JSON в Data

JSONDecoder().decode(JSONResponse.self, from: json.data(using: .utf8)!)
...