JSON 可解码嵌套数组具有不同的格式和类型
Posted
技术标签:
【中文标题】JSON 可解码嵌套数组具有不同的格式和类型【英文标题】:JSON Decodable nested array has varying formats and types 【发布时间】:2018-03-16 00:52:29 【问题描述】:苦苦思索如何处理具有不同类型和结构的可解码数组。本质上它是一个数据数组,这导致了 4 种类型的数组,每种类型都包含进一步的搜索结果数组。
您可以对具有不同格式的数组使用 decodeable 吗?还是只是简单地使用对象字典?
我会在底部附上我的 JSON
struct SearchData: Decodable
var success: Bool
var server_response_time: Int
var data: [SearchDataType]
//This is the array of 3 of the group types: "Movies", "TV-Shows", "Artists"
struct SearchDataType: Decodable
let group: String
let data: [SearchDataMovies]
// Where group = "Movies"
struct SearchDataMovies: Decodable
let title: String
let year: String
// Where group = "TV-Shows"
struct SearchDataTV: Decodable
let title: String
let year: Int
// Where group = "Artists"
struct SearchDataArtists: Decodable
let name: String
【问题讨论】:
最好先获取数据数组,然后使用字典区分组。 你为什么要为电视和电影创建单独的可解码,你可以使用一个,两者都使用字典中的相同键 以文本形式发布您的 JSON,而不是屏幕截图 【参考方案1】:Decodable 不会将您组中的字符串视为不同的组。所以有组:“组:电影”、“组:电视”和“组:游戏”没有意义。 JSON 中的所有组都处于同一级别。
这将是你的模型:
struct SearchData: Decodable
var success: Bool
var server_response_time: Int
var data: [SearchDataType]
//组名和组数组。
struct SearchDataType: Decodable
let group: String
let data: [SearchDataForGroup]
// 其中 group = 任何组(“电影”、“电视”、“游戏”等)
struct SearchDataForGroup: Decodable
let title: String
let year: String
如果您想使用 decodedable 调用您的组的名称:
在顶层声明一个变量:
let allGroupNames = [data] = []
然后在您的解码函数中,您可以像这样从组中提取所有组名:
let mygroups = try decoder.decode(SearchData.self, from: data)
对于 mygroups.data 中的 groupValue
self.all groupNames = groupValue.group
print(groupNames)
如果您的意图是创建一个包含您可以使用的部分的 tableView:
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return allGroupNames[section].group
不确定这是否是您的意图,但希望这可以帮助您入门。
【讨论】:
以上是关于JSON 可解码嵌套数组具有不同的格式和类型的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?