Swift ObjectMapper:如何解析数组内部的数组
Swift ObjectMapper: How to parse array inside of an array
这是我的 JSON 回复:
[
[
{
"id": 22,
"request_id": "rqst5c12fc9e856ae1.06631647",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Apache Load/Ubuntu",
}
],
[
{
"id": 24,
"request_id": "rqst5c130cae6f7609.41056231",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Load",
}
]
]
这个JSON结构得到了一个数组内部的数组,内部数组的对象就是我要解析的。这是我的映射器:
struct JobResponseDataObject: Mappable {
init?(map: Map) {
}
var id: Int?
var requestId: String?
var businessName: String?
var businessEmail: String?
mutating func mapping(map: Map) {
id <- map["id"]
requestId <- map["request_id"]
businessName <- map["business_name"]
businessEmail <- map["business_email"]
}
}
我已经尝试创建另一个映射器 struct
来保存对象数组 [JobResponseDataObject]
并使用 Alamofire 的 responseArray 来处理它,但它没有用。我也尝试过在我的 json id 前加上 0.
前缀,但这也没有用。请帮助
感谢
您可以在此处使用 Codable
来映射 JSON
响应,JobResponseDataObject
struct
应该如下所示,
struct JobResponseDataObject: Codable {
var id: Int?
var requestId: String?
var businessName: String?
var businessEmail: String?
var title: String?
private enum CodingKeys: String, CodingKey {
case id = "id"
case requestId = "request_id"
case businessName = "business_name"
case businessEmail = "business_email"
case title = "title"
}
}
let json = JSON(responseJSON: jsonData)
do {
if let value = try? json.rawData(){
let response = try! JSONDecoder().decode([[JobResponseDataObject]].self, from: value)
}
} catch {
print(error.localizedDescription)
}
所以这就是交易...Codable 是 Apple 的一个非常酷的协议,用于处理来自 API 的解析 JSON 响应。你得到的是一个数组数组,所以你的东西看起来像这样:
[[ResponseObject]]
所以不管怎样,你要创建你的对象的结构,像这样:
struct ResponseObject: Codable {
let id: Int?
let requestId: String?
let businessName: String?
let businessEmail: String?
let title: String?
}
您会注意到我稍微更改了密钥名称(而不是 request_id
,我使用 requestId
)。原因是 JSONDecoder
有一个名为 keyDecodingStrategy
的 属性,它提供了一个可以从中 select 的固定解码策略的枚举。你会 convertFromSnakeCase
.
您可以将这里的代码转储到操场上进行修改。基本上,声明你的结构,将它与你 JSON 中的任何键匹配,声明一个解码器,为它提供解码策略,然后解码它。
以下是调用 Alamofire 的方法:
private let backgroundThread = DispatchQueue(label: "background",
qos: .userInitiated,
attributes: .concurrent,
autoreleaseFrequency: .inherit,
target: nil)
Alamofire.request(url).responseJSON(queue: backgroundThread) { (response) in
guard response.result.error == nil else {
print("KABOOM!")
return
}
if let data = response.data {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
print(parsedResponse)
} catch {
print(error.localizedDescription)
}
}
}
这是您可以在操场上玩的代码。
import UIKit
let json = """
[
[
{
"id": 22,
"request_id": "rqst5c12fc9e856ae1.06631647",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Apache Load/Ubuntu",
}
],
[
{
"id": 24,
"request_id": "rqst5c130cae6f7609.41056231",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Load",
}
]
]
"""
struct ResponseObject: Codable {
let id: Int?
let requestId: String?
let businessName: String?
let businessEmail: String?
let title: String?
}
if let data = json.data(using: .utf8) {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
print(parsedResponse)
} catch {
print(error.localizedDescription)
}
}
您应该将此 JobResponseDataObject
结构用作 [[JobResponseDataObject]]
而不是 [JobResponseDataObject]
- 您在父结构或 [=15 中使用此结构制作 属性 =].
这是我的 JSON 回复:
[
[
{
"id": 22,
"request_id": "rqst5c12fc9e856ae1.06631647",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Apache Load/Ubuntu",
}
],
[
{
"id": 24,
"request_id": "rqst5c130cae6f7609.41056231",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Load",
}
]
]
这个JSON结构得到了一个数组内部的数组,内部数组的对象就是我要解析的。这是我的映射器:
struct JobResponseDataObject: Mappable {
init?(map: Map) {
}
var id: Int?
var requestId: String?
var businessName: String?
var businessEmail: String?
mutating func mapping(map: Map) {
id <- map["id"]
requestId <- map["request_id"]
businessName <- map["business_name"]
businessEmail <- map["business_email"]
}
}
我已经尝试创建另一个映射器 struct
来保存对象数组 [JobResponseDataObject]
并使用 Alamofire 的 responseArray 来处理它,但它没有用。我也尝试过在我的 json id 前加上 0.
前缀,但这也没有用。请帮助
感谢
您可以在此处使用 Codable
来映射 JSON
响应,JobResponseDataObject
struct
应该如下所示,
struct JobResponseDataObject: Codable {
var id: Int?
var requestId: String?
var businessName: String?
var businessEmail: String?
var title: String?
private enum CodingKeys: String, CodingKey {
case id = "id"
case requestId = "request_id"
case businessName = "business_name"
case businessEmail = "business_email"
case title = "title"
}
}
let json = JSON(responseJSON: jsonData)
do {
if let value = try? json.rawData(){
let response = try! JSONDecoder().decode([[JobResponseDataObject]].self, from: value)
}
} catch {
print(error.localizedDescription)
}
所以这就是交易...Codable 是 Apple 的一个非常酷的协议,用于处理来自 API 的解析 JSON 响应。你得到的是一个数组数组,所以你的东西看起来像这样:
[[ResponseObject]]
所以不管怎样,你要创建你的对象的结构,像这样:
struct ResponseObject: Codable {
let id: Int?
let requestId: String?
let businessName: String?
let businessEmail: String?
let title: String?
}
您会注意到我稍微更改了密钥名称(而不是 request_id
,我使用 requestId
)。原因是 JSONDecoder
有一个名为 keyDecodingStrategy
的 属性,它提供了一个可以从中 select 的固定解码策略的枚举。你会 convertFromSnakeCase
.
您可以将这里的代码转储到操场上进行修改。基本上,声明你的结构,将它与你 JSON 中的任何键匹配,声明一个解码器,为它提供解码策略,然后解码它。
以下是调用 Alamofire 的方法:
private let backgroundThread = DispatchQueue(label: "background",
qos: .userInitiated,
attributes: .concurrent,
autoreleaseFrequency: .inherit,
target: nil)
Alamofire.request(url).responseJSON(queue: backgroundThread) { (response) in
guard response.result.error == nil else {
print("KABOOM!")
return
}
if let data = response.data {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
print(parsedResponse)
} catch {
print(error.localizedDescription)
}
}
}
这是您可以在操场上玩的代码。
import UIKit
let json = """
[
[
{
"id": 22,
"request_id": "rqst5c12fc9e856ae1.06631647",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Apache Load/Ubuntu",
}
],
[
{
"id": 24,
"request_id": "rqst5c130cae6f7609.41056231",
"business_name": "Code Viable",
"business_email": "code@viable.com",
"title": "Load",
}
]
]
"""
struct ResponseObject: Codable {
let id: Int?
let requestId: String?
let businessName: String?
let businessEmail: String?
let title: String?
}
if let data = json.data(using: .utf8) {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
print(parsedResponse)
} catch {
print(error.localizedDescription)
}
}
您应该将此 JobResponseDataObject
结构用作 [[JobResponseDataObject]]
而不是 [JobResponseDataObject]
- 您在父结构或 [=15 中使用此结构制作 属性 =].