使用SwiftyJSON解析具有类似元素的JSON [英] Parse JSON with similar elements using SwiftyJSON

查看:98
本文介绍了使用SwiftyJSON解析具有类似元素的JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这种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_idsize_idquantity.为此,我创建了以下结构:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆