首页 > 解决方案 > 使用嵌套属性构建平面 JSON

问题描述

到目前为止,我在所做的搜索中发现的所有问题都是关于将嵌套的 JSON 解码为具有嵌套属性的某些结构。我想做相反的事情:将平面JSON 解码为具有嵌套属性的结构。

下面是 JSON 示例:

{
    "id":"ABC123",
    "cell":"test",
    "qty":24
}

我想解码成这个结构:

struct InventoryItem {
    let id: String
    let mfgInfo: MfgInfo
}

extension InventoryItem {
    struct MfgInfo {
        let cell: String
        let qty: Int
    }
}

我尝试为每个结构添加 CodingKeys:

struct InventoryItem: Decodable {
    let id: String
    let mfgInfo: MfgInfo

    enum CodingKeys: String, CodingKey {
        case id, mfgInfo
    }
}


struct MfgInfo: Decodable {
    let cell: String
    let qty: Int

    enum CodingKeys: String, CodingKey {
        case cell, qty
    }
}

但这不起作用。我收到此错误:

没有与键 CodingKeys(stringValue: \"mfgInfo\", intValue: nil) (\"mfgInfo\") 关联的值,转换为 mfg_info。

在没有自定义初始化程序的情况下如何使这项工作?还是我需要编写自定义init(with: Decoder)初始化程序?

标签: jsonswiftdecodable

解决方案


这只能通过自定义init(with: Decoder)实现实现,或者通过具有例如FlatInventoryItem符合的类型,Decodable然后提供该类型与所需InventoryItem类型之间的转换方法。


推荐阅读