Swift4从文件解码JSON时出错,寻求技术帮助
解决Swift4解码OneDrive JSON文件的问题
嘿,我来帮你搞定这个JSON解码的问题!从你给出的错误信息和代码来看,主要有两个关键问题需要解决:
1. 解码的对象类型不匹配
你提供的vocabulary.json是一个数组结构(用[]包裹着多个词汇对象),但你在解码的时候却尝试解析成单个Vocabulary对象,这肯定会失败呀!
你需要把解码的目标类型改成数组[Vocabulary].self,修改后的代码如下:
do { // 把Vocabulary.self改成[Vocabulary].self,对应JSON数组结构 let vocabularyList = try decoder.decode([Vocabulary].self, from: data) print(vocabularyList) } catch let e { print("failed to convert data \(e)") }
2. OneDrive的链接返回的不是纯JSON数据
你用的OneDrive链接https://onedrive.live.com/xxxxx/vokabeln.json,直接访问的话其实跳转到的是OneDrive的网页预览页面,而不是返回原始的JSON文件内容——这就是错误提示里说“给定的数据不是有效的JSON”的核心原因,因为你拿到的是HTML代码,不是JSON!
怎么获取正确的直接下载链接?
你需要把OneDrive的共享链接改成直接下载链接:
- 打开OneDrive中这个
vocabulary.json文件的共享设置,设置为“任何人可查看” - 生成共享链接后,复制链接,把链接里的
view或者embed替换成download。举个例子:
原链接:https://onedrive.live.com/view?cid=XXX&resid=XXX&authkey=XXX
修改后:https://onedrive.live.com/download?cid=XXX&resid=XXX&authkey=XXX
另外,你的DataManager里用了try!,这太危险了——如果链接无效或者网络出错,程序会直接崩溃!建议改成do-catch来处理错误:
public final class DataManager { public static func getJSONFromURL(_ resource:String, completion:@escaping (_ data:Data?, _ error:Error?) -> Void) { DispatchQueue.global(qos: .background).async { // 先校验URL是否有效 guard let url = URL(string: "https://onedrive.live.com/download/xxxxx/vokabeln.json") else { completion(nil, NSError(domain: "DataManager", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效的URL"])) return } do { let data = try Data(contentsOf: url, options: .uncached) completion(data, nil) } catch let fetchError { completion(nil, fetchError) } } } }
最后验证步骤
- 先把解码代码改成数组类型
- 替换OneDrive链接为修改后的直接下载链接
- 运行代码,应该就能成功解码出你的词汇列表啦!
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

