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 中解码具有许多唯一键的嵌套 JSON?

如何使用具有数组的 2 个结构解码 JSON

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

在 swift 4 和 Xcode 9 中解码 ExpandableTableView 的嵌套 json 数组

Swift 4 可解码的 json 数组

使用包含不同类型字典的 Swift 解码 JSON