анализ многомерности массива с использованием SwiftJson - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь проанализировать JSON с кодом и структурой, как это:

"custom_attributes": [
    {
        "attribute_code": "api_attribute",
        "value": [
            {
                "color": [
                    {
                        "value_index": "4",
                        "label": "Red",
                        "product_super_attribute_id": "1",
                        "default_label": "Red",
                        "store_label": "Red",
                        "use_default_value": true
                    }
                ]
            },
            {
                "size": [
                    {
                        "value_index": "13",
                        "label": "35",
                        "product_super_attribute_id": "2",
                        "default_label": "35",
                        "store_label": "35",
                        "use_default_value": true
                    }
                ]
            },

Я пробовал такой код:

Alamofire.request("http://adorableprojects.store/rest/V1/detailProduct/configurable-product").responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
            if let resData = swiftyJsonVar["custom_attributes"]["value"]["color"].arrayObject {
                self.arrImage = resData as! [[String:AnyObject]]

но я не получил результаты JSON вообще. когда я пытаюсь, если пусть resData = swiftyJsonVar ["custom_attributes"]. arrayObject я получаю весь результат

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вместо того, чтобы вручную анализировать весь ответ каждый раз, я бы предложил вам использовать для мощного API, предоставляемого Apple для нас, можно Codable .

Подробнее о кодируемом можно прочитать здесь: https://developer.apple.com/documentation/swift/codable

Вы можете определить ключи кодирования, которые хотите проанализировать, и получить готовые модели из Codable.

Пример кодирования:

Создайте свою модель соответственно

struct Root: Codable {
    let customAttributes: [CustomAttribute]

    enum CodingKeys: String, CodingKey {
        case customAttributes = "custom_attributes"
    }
}

struct CustomAttribute: Codable {
    let attributeCode: String
    let value: [Value]

    enum CodingKeys: String, CodingKey {
        case attributeCode = "attribute_code"
        case value
    }
}

struct Value: Codable {
    let color: [Color]
}

struct Color: Codable {
    let valueIndex, label, productSuperAttributeID, defaultLabel: String
    let storeLabel: String
    let useDefaultValue: Bool

    enum CodingKeys: String, CodingKey {
        case valueIndex = "value_index"
        case label
        case productSuperAttributeID = "product_super_attribute_id"
        case defaultLabel = "default_label"
        case storeLabel = "store_label"
        case useDefaultValue = "use_default_value"
    }
}

Использование:

Alamofire.request("http://adorableprojects.store/rest/V1/detailProduct/configurable-product").responseJSON { (responseData) -> Void in
                                if((responseData.result.value) != nil) {

                                    let swiftyJsonVar = JSON(responseData.result.value!)
                                    let customAttributesResponse = swiftyJsonVar["custom_attributes"]

                                    do {
                                        // You can parse response with codable's here
                                        let data = try customAttributesResponse.rawData()
                                        let customAttributes = try JSONDecoder().decode([CustomAttribute].self, from:data)
                                        print(customAttributes)
                                    }
                                    catch {
                                        debugPrint("\(#function)--\(error)")
                                    }
                                }

                            }
0 голосов
/ 17 января 2019

custom_attributes, value - массивы

Alamofire.request("http://adorableprojects.store/rest/V1/detailProduct/configurable-product").responseJSON { (responseData) -> Void in
    if((responseData.result.value) != nil) {

        let swiftyJsonVar = JSON(responseData.result.value!).dictionaryValue
        if let resData = swiftyJsonVar["custom_attributes"]?.arrayValue , let sec  =  resData.first?.dictionaryValue["value"]?.arrayValue , let color =  sec.first?.dictionaryValue["color"]?.arrayValue {
             print("dhjjhdhdsjhdsjdshjdsjhds   ",color) 
        }
        else {


        }

    }
}

Редактировать : доступ к размеру

Alamofire.request("http://adorableprojects.store/rest/V1/detailProduct/configurable-product").responseJSON { (responseData) -> Void in
    if((responseData.result.value) != nil) {

        let swiftyJsonVar = JSON(responseData.result.value!).dictionaryValue
        if let resData = swiftyJsonVar["custom_attributes"]?.arrayValue , let sec  =  resData.first?.dictionaryValue["value"]?.arrayValue , let color =  sec[1].dictionaryValue["size"]?.arrayValue {
             print("dhjjhdhdsjhdsjdshjdsjhds   ",size) 
        }
        else {


        }

    }
}

кстати рекомендую

struct Root: Codable {
    let customAttributes: [CustomAttribute]

    enum CodingKeys: String, CodingKey {
        case customAttributes = "custom_attributes"
    }
}

struct CustomAttribute: Codable {
    let attributeCode: String
    let value: [Value]

    enum CodingKeys: String, CodingKey {
        case attributeCode = "attribute_code"
        case value
    }
}

struct Value: Codable {
    let color: [Color]
}

struct Color: Codable {
    let valueIndex, label, productSuperAttributeID, defaultLabel: String
    let storeLabel: String
    let useDefaultValue: Bool

    enum CodingKeys: String, CodingKey {
        case valueIndex = "value_index"
        case label
        case productSuperAttributeID = "product_super_attribute_id"
        case defaultLabel = "default_label"
        case storeLabel = "store_label"
        case useDefaultValue = "use_default_value"
    }
}
...