【问题标题】:How can I print anything in my JSON file?如何在我的 JSON 文件中打印任何内容?
【发布时间】:2019-02-23 14:55:25
【问题描述】:

我在读取本地 JSON 文件时遇到问题。当我想尝试在我的 parseJson() 中打印任何内容时,我的控制台中什么也没有出现。

这是我的 JSON 文件:

{
  "questions":[
      {
          "question": "First Question ???",
          "response": "First Response",
      },
      {
          "question": "Second Question ???",
          "response": "Second Response",
      }
  ]
}  

这是我的问题Result.swift

import Foundation

struct questionsResult: Decodable {
    var questions: [Questions]
}

struct Questions: Decodable {
    var question: String
    var response: String
}

这是我在 ViewController 文件中的函数:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var questionsJson = [Questions]()

        func parseJSON(){
            if let url = Bundle.main.url(forResource: "test", withExtension: "json") {
                do {
                    let data = try Data(contentsOf: url)
                    let decoder = JSONDecoder()
                    let jsonData = try decoder.decode(questionsResult.self, from: data)
                    questionsJson.append(contentsOf: jsonData.questions)
                    print(url)

                } catch {
                    print("Json error \(error)")
                }
            }
        }
    }
}

你能帮帮我吗?

【问题讨论】:

  • 我看到了一些问题,questionsJson 被声明为不可变,并且您的函数将 Data 对象作为参数,但您也在从主包中读取文件。而且这个错误看起来像一个编译错误,是吗?

标签: swift


【解决方案1】:

假设你 var 声明你的 questionsJson 数组

var questionsJson = [Questions]()

这应该可以,注意我没有使用任何参数,而是从主包中读取文件

if let url = Bundle.main.url(forResource: "test", withExtension: "json") {
    do {
        let data = try Data(contentsOf: url)
        let decoder = JSONDecoder()
        let jsonData = try decoder.decode(questionsResult.self, from: data)          
        questionsJson.append(contentsOf: jsonData.questions)
    } catch {
        print("Json error \(error)")
    }
}

【讨论】:

  • questionsResult.self
  • 感谢您的回答!我已经更新了代码,我没有任何错误。但是当我想打印 JSON 中的内容时,控制台中不会显示任何内容。你知道为什么吗?
  • @Galnash,不知道。我建议您使用调试器来验证是否找到了资源(或者也使用打印语句)
  • 将其从您的 viewDidLoad 方法以及您的 func parseJSON() 方法中移出
  • @LeoDabus 太棒了!那是现在的工作!感谢您的回答和时间!
【解决方案2】:

您的代码中的主要问题是您是否添加了代码。 var questionsJson = [Questions]() 应该声明为视图控制器的属性。将其移出您的 viewDidLoad 方法以及您的 func parseJSON() 方法。您执行questionsJson object 的方式和您的 parseJSON 方法仅在您的 viewDidLoad 方法内退出,一旦您的方法完成,它们就会超出范围。

struct Root: Decodable {
    let questions: [Question]
}

struct Question: Decodable {
    let question: String
    let response: String
}

class ViewController: UIViewController {

    var questions: [Question] = []

    func parseJSON() {
        do {
            let url = Bundle.main.url(forResource: "test", withExtension: "json")!
            let decoder = JSONDecoder()
            questions = try decoder.decode(Root.self, from: Data(contentsOf: url)).questions
            for question in questions {
                print(question)
            }
        } catch {
            print(error)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        parseJSON()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多