这是我的JSON
{
"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个对象)。
下面是我希望它保存到的结构(不完整):
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?
发布于 2021-05-18 09:44:49
使用以下代码来解码嵌套的JSON以满足您的需求:
import Foundation
// 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:
发布于 2021-05-19 10:15:02
下面是你想要的结构:
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
}https://stackoverflow.com/questions/67578816
复制相似问题