Я пытаюсь декодировать файл JSON локально в моей программе, но получаю сообщение об ошибке - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь использовать JSON Decoder в Swift 4.1, но продолжаю получать

«Данные не могут быть прочитаны, потому что они не в правильном формате»

и я понятия не имею, почему.Я вызываю файл JSON из Bundle.main.path, а затем устанавливаю его в переменную после вызова его в URL(fileURLWithPath:).

. Просматривая путь к файлу и открывая его локально, кажется, что данные JSONв правильном формате.В моем файле data.json данные настроены следующим образом.

{
    "plant": "1015",
    "name": "SPEEDVALE",
    "key": "5035",
}

У меня есть структура, которая выглядит следующим образом

struct AllData: Decodable {
    let plant: String
    let name: String
    let key: String
}

Тогда у меня естьпеременная, объявленная как

private var x: [AllData] = []

А затем блок декодирования кода выглядит следующим образом

do {
    let path = Bundle.main.path(forResource: "data", ofType: "json")
    let jsonData = try Data(contentsOf: URL(fileURLWithPath: path!))

    do {
        plantDataSerialized = try [JSONDecoder().decode(AllData.self, from: jsonData)]
        print(plantDataSerialized)
    } catch let error{
        print(error.localizedDescription)
    }
} catch let error {
    print(error.localizedDescription)
}

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

у вас ошибка при чтении файла, поэтому просто используйте его вот так

guard let  jsonFile =  Bundle.main.path(forResource: "data", ofType: "json") else { return}

guard  let data = try? Data(contentsOf: URL(fileURLWithPath: jsonFile), options: []) else {return}


                do {
                    let plantDataSerialized = try [JSONDecoder().decode(AllData.self, from: data)]
                    print(plantDataSerialized)
                } catch let error{
                    print(error.localizedDescription)
                }
0 голосов
/ 25 мая 2018

Я думаю, что в вашем JSON есть массив пар ключ-значение, поэтому вы неправильно выполняете декодирование.Вы должны сделать так:

plantDataSerialized = try JSONDecoder().decode([AllData].self, from: jsonData)

Если в вашем JSON нет массива пар ключ-значение, вам нужно сделать это так:

plantDataSerialized = try JSONDecoder().decode(AllData.self, from: jsonData)
...