如何在JSON文件中打印任何内容?

时间:2019-02-23 14:55:26

标签: swift

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

这是我的JSON文件:

{
  "user": {
    "name": "Somebody",
    "password": "a_password",
    ...
  }
}

这是我的问题Result.swift

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

这是我在ViewController文件中的功能:

import Foundation

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

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

能帮我吗?

2 个答案:

答案 0 :(得分: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)")
    }
}

答案 1 :(得分:0)

代码中的主要问题是您添加了代码。 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()
    }
}