2
votes

Recherchez dans la réponse JSON et modifiez-la pour la publier à nouveau

J'ai un JSON compliqué

Je souhaite modifier plusieurs valeurs et le publier à nouveau Je veux remplacer chaque "SKU" par une valeur différente

data = {
"products": [
   {
        "name": {
            "ar": "PRODUCT_NAME",
            "en": "PRODUCT_NAME"
        },
        "description": {
            "ar": "PRODUCT_DESCRIPTION",
            "en": "PRODUCT_DESCRIPTION"
        },
        "preparation_time_in_minutes": 4,
        "image_path": "https://path/to/image.png",
        "index": 0,
        "pricing_type": 1,
        "selling_type": 1,
        "sku": "",
        "created_at": "2018-05-08 12:53:55",
        "updated_at": "2018-08-30 21:03:20",
        "taxable": "true",
        "is_combo": "false",
        "calories": "null",
        "is_active": "true",
        "hid": "_a7g34337",
        "barcode": "PRODUCT_BARCODE",
        "category": {
            "hid": "_697d1127"
        },
        "tags": [
           {
                "hid": "_16718997",
                "relationship_data": {
                    "index": 0
                }
            }
        ],
        "modifiers": [
           {
                "hid": "_567a437a",
                "relationship_data": {
                    "index": 0,
                    "is_required": "false",
                    "minimum_options": 0,
                    "maximum_options": 100,
                    "excluded_options": [
                        "_567a437a"
                    ]
                }
            }
        ],
        "timed_events": [
           {
                "hid": "_567a437a"
            }
        ],
        "sizes": [
           {
                "name": {
                    "en": "SIZE_NAME",
                    "ar": "SIZE_NAME"
                },
                "price": 20,
                "index": 0,
                "created_at": "2018-09-04 14:46:24",
                "updated_at": "2018-09-04 14:46:24",
                "barcode": "SIZE_BARCODE",
                "calories": 123,
                "sku": "",
                "cost": 0,
                "has_fixed_cost": "false",
                "hid": "_273ad637",
                "costingType": "ingredients",
                "ingredients": [
                   {
                        "hid": "_d741agg7",
                        "relationship_data": {
                            "is_optional": "false",
                            "quantity": 40,
                            "inactive_in_order_types": [
                                1,
                                2
                            ]
                        }
                    }
                ],
                "special_branch_prices": [
                   {
                        "branch_hid": "_d741agg7",
                        "price": 23
                    }
                ]
            }
        ]
    }
] }

Je veux trouver d'abord "SKU" et remplacer sa valeur

puis regarder à nouveau trouver un autre "SKU" et remplacer la valeur

J'ai essayé de trouver que la place du "SKU" change dans chaque requête


1 commentaires

Pouvez-vous nous montrer ce que vous avez essayé jusqu'à présent?


3 Réponses :


1
votes

Pour le premier sku, essayez ceci:

data["products"][0]["sizes"][0]["sku"] = "What you want x2"

et pour le second, essayez ceci:

data["products"][0]["sku"] = "What you want"

Pouvez-vous voir ce qui se passe-t-il ici? Nous devons d'abord dire au système que nous voulons lire les données. Ensuite, à l'intérieur des données, nous voulons lire les produits, qui contiennent une liste, dont nous voulons obtenir le premier élément, qui est 0. Dans cette liste, nous voulons trouver "sku", car il est là .

Maintenant, à l'intérieur de la même liste, il y a un autre élément appelé "tailles", qui a une liste, où l'un des éléments est "sku". Nous y accédons donc simplement et le modifions.


1 commentaires

Je peux me tromper, mais je pense qu'OP recherche une solution automatisée pour un nombre arbitraire de "sku" qui peuvent apparaître à différents niveaux du dictionnaire.



0
votes

Eh bien, si vous souhaitez l’automatiser et que la valeur est toujours la même pour chaque produit, vous pouvez faire quelque chose comme

for product in data['products']:
    product['sku'] = 'your custom sku'
    if 'sizes' in product:
        product['sizes'][0]['sku'] = 'a different sku for you!' # if sizes only contains a single item in the list
        # if sizes contains more items iterate through product['sizes'] and set each desires value

cela affichera:

for product in data["products"]:
    title = product.get('name').get("en")
    if title == 'something_you_want_to_modify':
        sku = 'product_sku_{}'.format(title)
        modify_value_from_json_by_key(product, "sku", sku)


2 commentaires

Le problème ici est que le premier SKU est différent du second même dans la même réponse, merci!


Je vais développer ma réponse. Peut-être que cela vous aidera davantage.



0
votes

J'ai rapidement créé une fonction basée sur la récursivité qui itère dans un dictionnaire python - json.loads(data).

def replaceKey(data, key_to_replace = 'sku', string_to_insert = ''):
    for key in data.keys():
        if (type(data[key]) is list and type(data[key][0]) is dict):
            for el in data[key]:
                replaceKey(el)
        elif (type(data[key]) is dict):
            replaceKey(data[key])
        elif (key == key_to_replace):
            data[key_to_replace] = string_to_insert


0 commentaires