我正在尝试在我的程序中本地解码JSON文件,但不断收到错误

时间:2018-05-25 19:56:48

标签: swift swift4 jsondecoder

我正在尝试在Swift 4.1中使用JSON解码器,但我一直在

  

“无法读取数据,因为格式不正确”

我不明白为什么。我正在调用Bundle.main.path中的JSON文件,然后在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 :(得分:1)

我认为您的JSON具有键值对数组,因此您正在以错误的方式进行解码。你必须这样做:

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

如果您的JSON没有键值对数组,那么您需要这样做:

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

答案 1 :(得分:1)

您在阅读文件时遇到错误,所以只需像这样使用

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