iOS : 用字典数组的数组拆箱 JSON
iOS : Unbox JSON with array of dictionary array
我想使用 Unbox 库解析 JSON 文件。 JSON 是字典数组的数组。我们该怎么做?我尝试使用 keypath 但无法解析它。我需要部分数组。
我尝试使用单一层次结构并能够解析它。
使用的库:https://github.com/JohnSundell/Unbox
{
"content": [
{
"section": [
{
"title": "Test1"
},
{
"title": "Test2"
}
]
},
{
"section": [
{
"title": "Test1"
},
{
"title": "Test2"
}
]
}
]
}
struct Data : Unboxable {
let title: String
init(title: String) {
self.title = title
}
init(unboxer: Unboxer) throws {
self.title = try unboxer.unbox(key: "title")
}
}
let dataArray : Data = try unbox(data: Data(contentsOf: url!))
您将需要一些嵌套的 struct
来保存所有可用数据。最小的数据结构是这样的:
struct MyData: Unboxable {
let content: [Content]
init(unboxer: Unboxer) throws {
content = try unboxer.unbox(key: "content")
}
// Nested structure for holding `Content` type
struct Content: Unboxable {
let section: [Section]
init(unboxer: Unboxer) throws {
section = try unboxer.unbox(key: "section")
}
// Nested structure for holding `Section` type
struct Section: Unboxable {
let title: String
init(unboxer: Unboxer) throws {
title = try unboxer.unbox(key: "title")
}
}
}
}
示例json及解析策略:
// Eventually, this is the data you maybe got from any server response
let jsonData = """
{
"content": [{
"section": [{
"title": "Test1"
},
{
"title": "Test2"
}
]
},
{
"section": [{
"title": "Test3"
},
{
"title": "Test4"
}
]
}
]
}
""".data(using: .utf8)!
// Now parse this
do {
let myData = try unbox(data: jsonData) as MyData
print(myData.content[0].section[0].title) //Test1
print(myData.content[0].section[1].title) //Test2
print(myData.content[1].section[0].title) //Test3
print(myData.content[1].section[1].title) //Test4
} catch {
print(error)
}
仅适用于 Swift 4 或更高版本
如果您没有绑定到 Swift 版本,还有更简单的方法可以实现:
// Your data structure goes this
struct MyData: Codable {
let content: [Content]
struct Content: Codable {
let section: [Section]
struct Section: Codable {
let title: String
}
}
}
// That's it
// Now you can parse the data like this:
do {
let myData = try JSONDecoder().decode(MyData.self, from: jsonData)
print(myData.content[0].section[0].title) //Test1
print(myData.content[0].section[1].title) //Test2
print(myData.content[1].section[0].title) //Test3
print(myData.content[1].section[1].title) //Test4
} catch {
print(error)
}
我想使用 Unbox 库解析 JSON 文件。 JSON 是字典数组的数组。我们该怎么做?我尝试使用 keypath 但无法解析它。我需要部分数组。
我尝试使用单一层次结构并能够解析它。
使用的库:https://github.com/JohnSundell/Unbox
{
"content": [
{
"section": [
{
"title": "Test1"
},
{
"title": "Test2"
}
]
},
{
"section": [
{
"title": "Test1"
},
{
"title": "Test2"
}
]
}
]
}
struct Data : Unboxable {
let title: String
init(title: String) {
self.title = title
}
init(unboxer: Unboxer) throws {
self.title = try unboxer.unbox(key: "title")
}
}
let dataArray : Data = try unbox(data: Data(contentsOf: url!))
您将需要一些嵌套的 struct
来保存所有可用数据。最小的数据结构是这样的:
struct MyData: Unboxable {
let content: [Content]
init(unboxer: Unboxer) throws {
content = try unboxer.unbox(key: "content")
}
// Nested structure for holding `Content` type
struct Content: Unboxable {
let section: [Section]
init(unboxer: Unboxer) throws {
section = try unboxer.unbox(key: "section")
}
// Nested structure for holding `Section` type
struct Section: Unboxable {
let title: String
init(unboxer: Unboxer) throws {
title = try unboxer.unbox(key: "title")
}
}
}
}
示例json及解析策略:
// Eventually, this is the data you maybe got from any server response
let jsonData = """
{
"content": [{
"section": [{
"title": "Test1"
},
{
"title": "Test2"
}
]
},
{
"section": [{
"title": "Test3"
},
{
"title": "Test4"
}
]
}
]
}
""".data(using: .utf8)!
// Now parse this
do {
let myData = try unbox(data: jsonData) as MyData
print(myData.content[0].section[0].title) //Test1
print(myData.content[0].section[1].title) //Test2
print(myData.content[1].section[0].title) //Test3
print(myData.content[1].section[1].title) //Test4
} catch {
print(error)
}
仅适用于 Swift 4 或更高版本
如果您没有绑定到 Swift 版本,还有更简单的方法可以实现:
// Your data structure goes this
struct MyData: Codable {
let content: [Content]
struct Content: Codable {
let section: [Section]
struct Section: Codable {
let title: String
}
}
}
// That's it
// Now you can parse the data like this:
do {
let myData = try JSONDecoder().decode(MyData.self, from: jsonData)
print(myData.content[0].section[0].title) //Test1
print(myData.content[0].section[1].title) //Test2
print(myData.content[1].section[0].title) //Test3
print(myData.content[1].section[1].title) //Test4
} catch {
print(error)
}