首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Swift Decodable解码嵌套的JSON结构?

如何使用Swift Decodable解码嵌套的JSON结构?
EN

Stack Overflow用户
提问于 2021-05-18 09:27:01
回答 2查看 76关注 0票数 1

这是我的JSON

代码语言:javascript
复制
{
    "myItems": {
        "item1name": [{
            "url": "google.com",
            "isMobile": true,
            "webIdString": "572392"
        }, {
            "url": "hulu.com",
            "isMobile": false,
            "webIdString": "sad1228"
        }],
        "item2name": [{
            "url": "apple.com",
            "isMobile": true,
            "webIdString": "dsy38ds"
        }, {
            "url": "Facebook.com",
            "isMobile": true,
            "webIdString": "326dsigd1"
        }, {
            "url": "YouTube.com",
            "isMobile": true,
            "webIdString": "sd3dsg4k"
        }]
    }
}

json可以有多个项目(如item1name、item2name、item3name等)并且每个项目可以有多个对象(示例中第一个项目有2个对象,第二个项目有3个对象)。

下面是我希望它保存到的结构(不完整):

代码语言:javascript
复制
struct ServerResponse: Decodable {
    let items: [MyItem]?
}

struct MyItem: Decodable {
    let itemName: String?
    let url: String?
    let isMobile: Bool?
    let webIdString: String?
}

在上面的示例中,这意味着items列表应该有五个MyItem对象。例如,这些是MyItem对象:

#1: itemName: item1name,url: google.com,isMobile: true,webIdString: 572392

#2: itemName: item1name,url: hulu.com,isMobile: false,webIdString: sad1228

#3: itemName: item2name,url: apple.com,isMobile: true,webIdString: dsy38ds

#4: itemName: item2name,url: Facebook.com,isMobile: true,webIdString: 326dsigd1

#5: itemName: item2name,url: YouTube.com,isMobile: true,webIdString: sd3dsg4k

使用Decodable做这件事最好的方法是什么?任何帮助都将不胜感激。我认为这可能类似于这个问题:How to decode a nested JSON struct with Swift Decodable protocol?

EN

回答 2

Stack Overflow用户

发布于 2021-05-18 09:44:49

使用以下代码来解码嵌套的JSON以满足您的需求:

import Foundation

代码语言:javascript
复制
// MARK: - Websites
struct Websites: Codable {
    var myItems: MyItems
}

// MARK: - MyItems
struct MyItems: Codable {
    var item1Name, item2Name: [ItemName]
    enum CodingKeys: String, CodingKey {
        case item1Name = "item1name"
        case item2Name = "item2name"
    }
}

// MARK: - ItemName
struct ItemName: Codable {
    var url: String
    var isMobile: Bool
    var webIDString: String
    enum CodingKeys: String, CodingKey {
        case url, isMobile
        case webIDString = "webIdString"
    }
}

注意:请根据需要更改变量的名称。

编辑

如果您仍然面临问题,使用此应用程序将您的JSON转换为Struct:

Quick Type

票数 0
EN

Stack Overflow用户

发布于 2021-05-19 10:15:02

下面是你想要的结构:

代码语言:javascript
复制
struct Websites: Decodable {
    let items: [Item]

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: Key.self)
        items = try container.decode([String: [Item]].self, forKey: .myItems).values.flatMap { $0 }
    }

    private enum Key: String, CodingKey {
        case myItems
    }
}

struct Item: Decodable {
    let url: String
    let isMobile: Bool
    let webIdString: String
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67578816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档