IOS swiftUI 无法从本地文件读取 json

Lui*_*ujo 1 xcode ios swift swiftui

我是 IOS 开发的新手,我正在使用 swiftUI 并遵循本教程https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation但我已经被困在这里一段时间了,在教程,他们从项目中的 json 文件中传递一项

struct LandmarkRow_Previews: PreviewProvider {
static var previews: some View {
    LandmarkRow(landmark: landmarkData[0])
   }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试对我自己的数据做同样的事情,我有一个名为 sorteosData.json 的文件,但是当我尝试将第一个项目传递给预览时,它显示“使用未解析的标识符”

struct PastSorteoRowView_Previews: PreviewProvider {
static var previews: some View {
    PastSorteoRowView(sorteo: sorteosData[0])
}
Run Code Online (Sandbox Code Playgroud)

Xcode 无法识别 sorteosData[0],我该如何解决?我遵循了教程中的所有步骤,但由于某种原因,我无法将数据传递给预览

Joa*_*nes 13

随着JSON你需要使用JSONDecoder(). 假设我们有这个文件:

[
    {
        "name": "Banana",
        "points": 200,
        "description": "A banana grown in Ecuador."
    },
    {
        "name": "Orange",
        "points": 100
    }
]
Run Code Online (Sandbox Code Playgroud)

为方便起见,您可以创建一个struct(即使对于嵌套元素也很方便):

struct product: Codable, Hashable {
    var name: String
    var points: Int
    var description: String?
}
Run Code Online (Sandbox Code Playgroud)

创建一个函数来解析你的JSONin 包,调用list.json它返回一个arrayof struct product

func jsonTwo() -> [product]{
    let url = Bundle.main.url(forResource: "list", withExtension: "json")!
    let data = try! Data(contentsOf: url)
    let decoder = JSONDecoder()
    let products = try? decoder.decode([product].self, from: data)
    return products!
}
Run Code Online (Sandbox Code Playgroud)

最后设置你的界面:

var body: some View {
   List{
     ForEach(jsonTwo(), id: \.self) { item in
       VStack(alignment: .leading, spacing: 0){
          Text("name:\(item.name) - points:\(item.points)")
          Text("\(item.description ?? "")")
       }
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

完整代码:

struct product: Codable, Hashable {
    var name: String
    var points: Int
    var description: String?
}

struct ContentView: View {
    
    func jsonTwo() -> [product]{
        let url = Bundle.main.url(forResource: "list", withExtension: "json")!
        let data = try! Data(contentsOf: url)
        let decoder = JSONDecoder()
        let products = try? decoder.decode([product].self, from: data)
        return products!
    }

    
    var body: some View {
        List{
            ForEach(jsonTwo(), id: \.self) { item in
                VStack(alignment: .leading, spacing: 0){
                    Text("name:\(item.name) - points:\(item.points)")
                    Text("\(item.description ?? "")")
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明