使用SwiftyJSON解析具有类似元素的JSON [英] Parse JSON with similar elements using SwiftyJSON
问题描述
我有这种JSON类型(只是一个简短的示例):
I have this type of JSON (just a short sample):
"orderProducts": [
{
"id": 135,
"order_id": 39,
"product_id": 49,
"product_code": "",
"size_id": 13,
"quantity": 2,
"product": {
"id": 49,
"code": "",
"factory_id": 2,
"product_category_id": 1,
"sex_id": null,
"season_id": null,
"product_type_id": null,
"type_id": null,
"color_id": null,
"year_id": null,
"image_1": "bceef8b28ae2a1797ca0c6300021100d.jpeg",
"image_2": "",
"image_3": "",
"notes": "",
"status": 10
}
},
{
"id": 136,
"order_id": 39,
"product_id": 49,
"product_code": "",
"size_id": 14,
"quantity": 3,
"product": {
"id": 49,
"code": "",
"factory_id": 2,
"product_category_id": 1,
"sex_id": null,
"season_id": null,
"product_type_id": null,
"type_id": null,
"color_id": null,
"year_id": null,
"image_1": "bceef8b28ae2a1797ca0c6300021100d.jpeg",
"image_2": "",
"image_3": "",
"notes": "",
"status": 10
}
},
{
"id": 137,
"order_id": 39,
"product_id": 48,
"product_code": "",
"size_id": null,
"quantity": 24,
"product": {
"id": 48,
"code": "",
"factory_id": 2,
"product_category_id": null,
"sex_id": null,
"season_id": null,
"product_type_id": null,
"type_id": null,
"color_id": null,
"year_id": null,
"image_1": "2aee8660b4218bf549c2d9345beb2a01.jpeg",
"image_2": "",
"image_3": "",
"notes": "",
"status": 10
}
}]
我需要解析的项目是:product_id
,size_id
和quantity
.为此,我创建了以下结构:
Items I need to parse are: product_id
, size_id
and quantity
. For this, I have created this struct:
struct Products {
let id: String
let quantities: [(sizeId: String, quantity: String)]?
init(id: String, quantities: [(sizeId: String, quantity: String)]) {
self.id = id
self.quantities = quantities
}
}
我想要达到的最终结果是:
The end result I'm trying to achieve is:
[Products(id: "49", quantities: [(sizeId: "13", quantity: "2"), (sizeId: "14", quantity: "3")]),
Products(id: "48", quantities: [(sizeId: "null", quantity: "24")])]
使用SwiftyJSON进行解析时,我会这样做:
When parsing using SwiftyJSON, I do this:
for productId in products.arrayValue {
self.productWithQuantites.append(Products(id: productId["product_id"].stringValue,
quantities: [(sizeId: productId["size_id"].stringValue,
quantity: productId["quantity"].stringValue)]))
}
但是我明白了:
[Products(id: "49", quantities: [(sizeId: "13", quantity: "2")]),
Products(id: "49", quantities: [(sizeId: "14", quantity: "3")],
Products(id: "48", quantities: [(sizeId: "null", quantity: "24")])]
我做错了什么?如何将新数量添加到现有元素中?感谢代码示例或任何帮助.
What I'm doing wrong? How can I append new quantities to my existing elements? Would be thankful for a code sample or any help.
推荐答案
为了在这样的循环中更轻松地进行修改,您应该将Products
设为一个类,因为它是通过引用传递的.另外,在Products
中将quantities
更改为var
,并将解析代码替换为此:
For easier modification in loops like this, you should make Products
a class, since it's passed by reference. Also, make quantities
to a var
in your Products
and replace the parsing code to this:
for product in products.arrayValue {
let productId = product["product_id"].stringValue
let quantity = (sizeId: product["size_id"].stringValue,
quantity: product["quantity"].stringValue)
if let product = self.productWithQuantites.filter({ $0.id == productId }).first {
product.quantities?.append(quantity)
} else {
self.productWithQuantites.append(Products(id: productId, quantities: [quantity]))
}
}
此代码将新的元组附加到现有产品的quantities
属性,或者如果不存在,则创建新的Products
并将其附加到productWithQuantites
.
This code appends a new tuple to the quantities
property of an existing product, or if it does not exist, it creates a new Products
and appends that to productWithQuantites
.
这篇关于使用SwiftyJSON解析具有类似元素的JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!