当 parent 和 child 具有相同数据时,如何使用 Alamofire 解析数据?
How to parse data using Alamofire when parent and child have same data?
我正在使用 Alamofire 调用和解析 json 数据,但问题是响应不正确。 parent 和 child 具有相同的数据,因此解析器更改了解析中的 ID,并且项目数量减少了。下面的数据是我想使用模型
解析的 json
{
"error": false,
"message": "",
"data": [
{
"id": 1,
"parent_id": null,
"name": "Ink Cartridge",
"notes": null,
"children": [
{
"id": 5,
"parent_id": 1,
"name": "Colored",
"notes": null
}
]
},
{
"id": 2,
"parent_id": null,
"name": "Toner Cartridge",
"notes": null,
"children": []
},
{
"id": 3,
"parent_id": null,
"name": "Combo",
"notes": null,
"children": []
},
{
"id": 4,
"parent_id": null,
"name": "Combo Set",
"notes": null,
"children": []
}
]
}
我正在使用这个 Alamofire 和 SwiftyJSON 库
Alamofire.request(ServerAPI.getCategories()).responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil) {
let swiftyJsonVar = JSON(responseData.result.value!)
print(swiftyJsonVar)
}
}
}
试试这个,你应该使用 Codable,因为它使这更容易。
构建这些结构,parent 结构使用常量名称遍历数据,例如让 id,将为您提供数据的 "id" 部分。然后我构建了另一个结构,这样当它通过 children 时,它会在内部使用该结构做同样的事情。
struct Parent: Codable {
let id: Int
let parent_id: Int?
let name: String
let notes: String?
let children: [Child]?
}
struct Child: Codable {
let id: Int
let parent_id: Int?
let name: String
let notes: String?
}
然后你需要一个变量来保存这个数据:
var completeData = [Parent]()
在你的通话中:
do {
let dataParsed = try JSONDecoder().decode([Parent].self, from: data
self.completeData = dataParsed
} catch {
print(error)
}
要访问它,您应该能够做到
var accessingID = self.completeData[0].id
并且对于 child:
var accessingChild = self.completeData[0].children.id
我不确定你想要数据的方式,所以你可能想弄乱你处理数组的方式,我还没有能够测试,但应该是这样的。
请记住,如果该值可能为空,您需要在结构中使用 ?
。此方法也不使用 Alamofire 或 SwiftyJSON,因为 Codable 使得使用结构来做这种事情变得更加快捷和方便。
我正在使用 Alamofire 调用和解析 json 数据,但问题是响应不正确。 parent 和 child 具有相同的数据,因此解析器更改了解析中的 ID,并且项目数量减少了。下面的数据是我想使用模型
解析的 json{
"error": false,
"message": "",
"data": [
{
"id": 1,
"parent_id": null,
"name": "Ink Cartridge",
"notes": null,
"children": [
{
"id": 5,
"parent_id": 1,
"name": "Colored",
"notes": null
}
]
},
{
"id": 2,
"parent_id": null,
"name": "Toner Cartridge",
"notes": null,
"children": []
},
{
"id": 3,
"parent_id": null,
"name": "Combo",
"notes": null,
"children": []
},
{
"id": 4,
"parent_id": null,
"name": "Combo Set",
"notes": null,
"children": []
}
]
}
我正在使用这个 Alamofire 和 SwiftyJSON 库
Alamofire.request(ServerAPI.getCategories()).responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil) {
let swiftyJsonVar = JSON(responseData.result.value!)
print(swiftyJsonVar)
}
}
}
试试这个,你应该使用 Codable,因为它使这更容易。 构建这些结构,parent 结构使用常量名称遍历数据,例如让 id,将为您提供数据的 "id" 部分。然后我构建了另一个结构,这样当它通过 children 时,它会在内部使用该结构做同样的事情。
struct Parent: Codable {
let id: Int
let parent_id: Int?
let name: String
let notes: String?
let children: [Child]?
}
struct Child: Codable {
let id: Int
let parent_id: Int?
let name: String
let notes: String?
}
然后你需要一个变量来保存这个数据:
var completeData = [Parent]()
在你的通话中:
do {
let dataParsed = try JSONDecoder().decode([Parent].self, from: data
self.completeData = dataParsed
} catch {
print(error)
}
要访问它,您应该能够做到
var accessingID = self.completeData[0].id
并且对于 child:
var accessingChild = self.completeData[0].children.id
我不确定你想要数据的方式,所以你可能想弄乱你处理数组的方式,我还没有能够测试,但应该是这样的。
请记住,如果该值可能为空,您需要在结构中使用 ?
。此方法也不使用 Alamofire 或 SwiftyJSON,因为 Codable 使得使用结构来做这种事情变得更加快捷和方便。