我读取本地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
}
能帮我吗?
答案 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()
}
}