【问题标题】:Parsing local json file on Swift在 Swift 上解析本地 json 文件
【发布时间】:2020-07-17 21:21:55
【问题描述】:

我有一个本地 JSON 并尝试解码,但出现“预期解码 Array 但找到字典”错误。 json文件和下面的两个结构:

 {
"Stanford University": [{
        "type": "government",
        "name": "Stanford University",
        "city": "Santa Clara",
        "major": "Computer Engineering"
    },
    {
        "type": "government",
        "name": "Stanford University",
        "city": "Santa Clara",
        "major": "Economics"
    }
],
"Berkeley University": [{
        "type": "foundation",
        "name": "Berkeley University",
        "city": "Alameda",
        "major": "Communication"
    },
    {
        "type": "foundation",
        "name": "Berkeley University",
        "city": "Alameda",
        "major": "Physics"
    }
]

}

两个结构:

struct Universite4: Codable {  
    let name: String?
    let major:[Major]?
} 

struct Major: Codable {
    let type: String?
    let name: String?
    let major: String? }

这是数据加载和解码的代码;

public class DataLoader {
    
    @Published var universite4 = [Universite4]()
    
    init() {
        load()
    }
    
    func load() {
        if let unv4json = Bundle.main.url(forResource: "unv4", withExtension: "json") {
            do {
                let data = try Data(contentsOf: unv4json)
                let jsonDecoder = JSONDecoder()
                let dataFromJson = try jsonDecoder.decode([Universite4].self, from:data)
                
                
                self.universite4 = dataFromJson
                
            } catch {
                print("Error: \(error)")
            }
            
        }
    }
}

有人知道我该如何修复上面的代码吗?问候。

【问题讨论】:

  • 最简单的方法是使用quicktype.io 可以将您的 json 转换为 swift 结构的站点。但基本上错误很明显,您试图将 json 数据解码为一个数组,但它是一个以“斯坦福大学”为键的字典。 (和 struct Major 不相关)
  • 对不起 Joakim,这是我的错误,我已经修复了 json 并再次过去。结构 Major 现在是相关的。
  • 好吧,您在 json 的顶层没有键“名称”,所以现在 Universite4 不相关,请参阅下面来自 Camilo 的答案
  • 嗨 Joakim,如果我在 json 的顶层没有“name”键怎么办?可以通过其他方式实现吗?
  • 再来看看下面的答案。

标签: json swift dictionary parsing


【解决方案1】:

尝试更改,这里的问题是实际上您的键是我不推荐的“动态键”,但如果您必须使用它们,那么试试这个。

let dataFromJson = try jsonDecoder.decode([Universite4].self, from:data)

到

let dataFromJson = try jsonDecoder.decode([String:[Major]].self, from:data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-04-23
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多