You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

最后验证步骤

  1. 先把解码代码改成数组类型
  2. 替换OneDrive链接为修改后的直接下载链接
  3. 运行代码,应该就能成功解码出你的词汇列表啦!

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:54:03