【问题标题】:Load json from file with swift 3使用swift 3从文件中加载json
【发布时间】:2017-08-25 13:08:35
【问题描述】:

我正在尝试使用此代码从文件中加载 json 字符串。

if let filepath = Bundle.main.path(forResource: "data", ofType: "json") {
    do {
        let contents = try String(contentsOfFile: filepath)
        print(contents)
    } catch {
        // contents could not be loaded
        print("could not be loaded")
    }

} else {

}

但我收到“无法加载”消息。代码错了吗?还是我应该把文件放在一个特定的文件夹中?目前我将它放在一个名为 models 的文件夹中。

编辑:我检查了错误内容,json文件的位置没有问题,当我尝试将其转换为String时出现问题。它告诉我编码不同...

错误域=NSCocoaErrorDomain Code=264 "Die Datei „data.json" konnte nicht geöffnet werden, da die Textcodierung des Inhalts nicht bestimmt 韦登坎恩。”

【问题讨论】:

  • 将该文件放在目标的根目录中
  • 打印错误:/*...*/ catch(error) { print(error) - 它说什么?
  • 检查你的 json 文件的目标成员。
  • 将文件作为数据(不是字符串)读取并检查是否有效。无论如何都应该从数据中完成 JSON 解码。
  • 请将错误信息翻译成英文。谢谢。

标签: ios json swift


【解决方案1】:

首先确保您已标记copy item if needed 复选标记,并且在添加 .json 文件时也标记了您的目标,之后您的主要问题是加载文件的方式,您需要使用 @ 执行此操作987654322@而不是String

使用此方法加载您的 json 并在回调中获取结果

     func loadJSON(finishedClosure:@escaping ((_ jsonObject:[String:AnyObject]?,_ error: NSError?) ->Void))
{
    DispatchQueue.global().async {
        guard let path = Bundle.main.path(forResource: "yourJSON", ofType: "json") else{
            DispatchQueue.main.async {
                finishedClosure(nil, NSError(domain: "JSON file don't founded", code: 998, userInfo: nil)) 
            }
            return
        }
        //Load file data part
        guard let jsonData = (try? Data(contentsOf: URL(fileURLWithPath: path))) else{
            DispatchQueue.main.async {
                finishedClosure(nil, NSError(domain: "can convert to data", code: 999, userInfo: nil))  
            }
            return
        }

        do {
            if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String:AnyObject]
            {
                DispatchQueue.main.async {
                    finishedClosure(jsonObject,nil)
                }
            }
        } catch let error as NSError {
            print(error)
            DispatchQueue.main.async {
                finishedClosure(nil,error)
            }
        }
    }
}

【讨论】:

  • 发布的截图和代码都与问题无关,无助于解决OP的问题。如果您不同意,请解释为什么他们会提供帮助。
  • @NikolaiRuhe 我认为用户在从文件加载 json 时遇到问题,所以我添加了一个很好的实现并添加了一个屏幕截图以确保他在自己的项目中正确添加文件,可以你解释为什么你认为这没有帮助?如果您阅读了我的方法实现,请按照您在评论中的建议加载 json 内容并将文件作为数据读取
  • 1.屏幕截图突出显示了错误的复选框(如果您担心文件是否正确复制到包中)。
  • 2.如果文件处于正确的复制阶段,更好的提示是检查构建阶段。
  • @ReinierMelian : 您的免责声明首先确保您已标记复制项目(如果需要复选标记),并且在您添加 .json 文件时也标记了您的目标, 有帮助! !!我想知道为什么没有在代码中读取该文件。谢谢伙计!
【解决方案2】:

Swift 4 - 将 JSON 文件解析为字符串和数据类型

该错误表明文件无法作为字符串读取,因为无法确定文本编码。您应该明确提供 json 文件的实际编码。

要检查文件的编码,请在 XCode 中打开文件并查看右侧栏中的文件检查器:

if let filePath = Bundle.main.path(forResource: "data", ofType: "json"),
   let data = NSData(contentsOfFile: filePath) {
  do {

    // here you have your json parsed as string:
    let jsonString = try? String(contentsOfFile: filePath, encoding: String.Encoding.utf8)

    // but it is better to use the type data instead:
    let jsonData = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.allowFragments)
  }
  catch {
    //Handle error
  }
}

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2017-08-16
    • 2017-02-16
    • 2017-12-17
    • 2016-07-30
    • 2017-06-15
    相关资源
    最近更新 更多