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
3 Réponses :
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.
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.
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)
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.
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
Pouvez-vous nous montrer ce que vous avez essayé jusqu'à présent?