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

Posted

技术标签:

【中文标题】我正在尝试在我的程序中本地解码 JSON 文件,但不断收到错误【英文标题】:I'm trying to Decode a JSON file locally in my program, but keep getting Error 【发布时间】:2018-05-25 19:56:48 【问题描述】:

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

然后我有一个声明为 this 的变量

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)

【问题讨论】:

“无法读取数据,因为它的格式不正确”是什么意思? 这只是控制台中出现的错误。当我调试时它进入第一个 catch let 错误范围 我已经执行了你的代码并给出了正确的结果 [__lldb_expr_69.AllData(plant: "1015", name: "SPEEDVALE", key: "5035")] @SamaBalaYam 你能告诉我在控制台中读取文件后如何显示数据吗?我也试图弄清楚这一点。 像 private var x: [AllData] = [] ...... ..... x = try [JSONDecoder().decode(AllData.self, from: jsonData) ] 打印(x) 【参考方案1】:

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

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

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

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

【讨论】:

然后我得到“无法将类型'AllData'的值分配给类型'[AllData]'”所以我尝试制作plantDataSerialized:AllData?但这没有用。 @simonmcneil plantDataSerialized 具有 AllData 数组。表示 plantDataSerialized 将自动获取 [AllData] 中的响应。您不需要使用其他变量。【参考方案2】:

你在读取文件时出错,所以就这样使用它

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)
                

【讨论】:

以上是关于我正在尝试在我的程序中本地解码 JSON 文件,但不断收到错误的主要内容,如果未能解决你的问题,请参考以下文章

显示我的应用程序上的JSON本地文件的数据

快速解码 JSON 数组或字典错误

为啥我不能在 Swift 中解码我的 JSON 文件?

解析 JSON 错误“预期解码 Array<Any> 但找到了一个数字

如何将 JSON 解码为不同的类型?

SwiftUI:尝试加载本地 JSON 数据时,Canvas 出现预览错误