JSON Decodable嵌套数组具有不同的格式和类型

时间:2018-03-16 00:52:30

标签: ios json swift swift4 decodable

苦苦挣扎着弄清楚如何处理我的可解码数组,它有不同的类型和结构。本质上,它是一个数据数组,它导致一个包含4种类型的数组,每种类型都包含另一组搜索结果。

您是否可以对具有不同格式的数组使用decodable?或者它只是使用对象dicts?

我会在底部附上我的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
}

enter image description here

1 个答案:

答案 0 :(得分:2)

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]
}

//其中组=任何组(“电影”,“电视”,“游戏”等)

struct SearchDataForGroup: Decodable {
let title: String
let year: String
}

如果您想使用可解码的名称来呼叫组名:

在顶层声明一个变量:

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
}

不确定这是否是您的意图,但希望这可以帮助您入门。