SwiftUI:尝试加载本地 JSON 数据时,Canvas 出现预览错误

Posted

技术标签:

【中文标题】SwiftUI:尝试加载本地 JSON 数据时,Canvas 出现预览错误【英文标题】:SwiftUI: I get a preview error in the Canvas when trying to load local JSON Data 【发布时间】:2019-10-23 11:32:49 【问题描述】:

我目前正在尝试在我的应用程序的 .json 文件中以本地 Data 开始学习 JSON。我按照在线说明构建了一个示例行,然后将其放入列表中。 Data 来自我按照正确格式创建的 .json 文件。

当我尝试在 Canvas 中预览作品时,我收到一条错误消息:

无法在此文件中预览 - JSON Practice.app 可能已崩溃。

我是 SwiftUI 的新手,也是动态列表和 JSON 数据的新手,所以也许社区中的某个人可以告诉我哪里出错了。我在网上到处找,但找不到我的问题的答案。

在网上搜索了类似的项目或教程,到目前为止我看不出代码有什么不同。我还查看了来自 Apple 的 SwiftUI Tutorials 的列表和导航,它显示了如何在本地从 JSON 文件读取数据,但即使我使用的代码几乎相同,我也会收到此错误。

我的 JSON 文件如下所示:

[
    
        "id": 0,
        "name": "Salzburg",
        "image": "salzburg",
        "detail": "A small but beautiful Town in upper Austria",
    ,

        "id": 1,
        "name": "Vienna",
        "image": "Vienna",
        "detail": "The Capital of Austria",
    ,

        "id": 2,
        "name": "Linz",
        "image": "Linz",
        "detail": "The third largest town in Austria",
    
]

我的数据文件如下所示:

import SwiftUI

let citiesData: [City] = load("cities.json")

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T 
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else 
        fatalError("Couldn't find \(filename) in main bundle.")
    

    do 
        data = try Data(contentsOf: file)
     catch 
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    

    do 
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
     catch 
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    

我的解码器(不确定是不是它的名字)文件看起来像这样:

import SwiftUI

struct City: Hashable, Codable, Identifiable 
    var id: Int
    var name: String
    var image: String
    var detail: String

我的行文件看起来像这样:

import SwiftUI

struct CityRow: View 

    var city: City

    var body: some View 
        Text(city.name)
    


struct CityRow_Previews: PreviewProvider 
    static var previews: some View 
        CityRow(city: citiesData[1])
    

预览 Row 文件时,它应该显示第一个城市名称,但它却给了我上面提到的错误。

【问题讨论】:

【参考方案1】:

你的json数组中只有一个值,试试

struct CityRow_Previews: PreviewProvider 
static var previews: some View 
    CityRow(city: citiesData[0])


【讨论】:

感谢您的回复,我编辑了帖子以显示整个 .json 文件。我之前只发布了一个块来表明它是正确的。【参考方案2】:

好的,这些是我觉得我真的很愚蠢的时刻。原来 JSON 文件的格式很糟糕,在详细信息行之后不应该有 ,

感谢您阅读并尝试提供帮助。我希望下一个人能看到这个并比我更快地解决它

【讨论】:

【参考方案3】:

对我来说,json 文件没有复制到捆绑资源中。为此:

点击您的项目 点击您的目标 选择构建阶段 扩展复制捆绑资源 点击“+”并选择您的文件。

【讨论】:

以上是关于SwiftUI:尝试加载本地 JSON 数据时,Canvas 出现预览错误的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 从 URL 加载单个对象 JSON

在 SwiftUI 中将 JSON 数据作为对象加载

Swiftui 为 Json 数据项创建加载更多按钮

在 SwiftUI 中将加载的 json 文件中的更改保存到 Core Data

如何使用 http get 从本地 Json 文件加载数据?

使用 SwiftUI 2.0 和 Core Data 预填充数据