Bonjour, j'essaie de prendre les données d'un fichier JSON, de les insérer et de les identifier, puis d'effectuer POST REST .
{
'name':'myname'
}
et je voudrais ajouter un identifiant pour que les données json ressemblent à:
{
'id': 134,
'name': 'myname'
}
Alors j'ai essayé:
import json
f = open("data.json","r")
data = f.read()
jsonObj = json.loads(data)
Je n'arrive pas à charger le fichier au format JSON. Que dois-je faire pour pouvoir convertir le fichier json en objet json et ajouter une autre valeur id.
Définir l'élément en utilisant data['id'] = ...
.
import json
with open('data.json', 'r+') as f:
data = json.load(f)
data['id'] = 134 # <--- add `id` value.
f.seek(0) # <--- should reset file position to the beginning.
json.dump(data, f, indent=4)
f.truncate() # remove remaining part
la solution de falsetru est bien, mais a un petit bug:
Supposons que la longueur initiale de "id" était supérieure à 5 caractères. Lorsque nous vidons ensuite avec le nouveau "id" (134 avec seulement 3 caractères), la longueur de la chaîne écrite à partir de la position 0 dans le fichier est plus court que la longueur d'origine. Des caractères supplémentaires (tels que '}') laissés dans le fichier à partir du contenu d'origine.
J'ai résolu ce problème en remplaçant le fichier d'origine.
import json
import os
filename = 'data.json'
with open(filename, 'r') as f:
data = json.load(f)
data['id'] = 134 # <--- add `id` value.
os.remove(filename)
with open(filename, 'w') as f:
json.dump(data, f, indent=4)
Je voudrais présenter une version modifiée de la solution de Vadim. Il est utile de gérer les demandes asynchrones d’écriture/modification de fichier json. Je sais que cela ne faisait pas partie de la question initiale, mais pourrait être utile pour les autres.
En cas de modification de fichier asynchrone, os.remove(filename)
lèvera FileNotFoundError
si les demandes sont fréquentes. Pour résoudre ce problème, vous pouvez créer un fichier temporaire avec un contenu modifié, puis le renommer en même temps que l'ancienne version. Cette solution fonctionne correctement pour les cas synchrones et asynchrones.
import os, json, uuid
filename = 'data.json'
with open(filename, 'r') as f:
data = json.load(f)
data['id'] = 134 # <--- add `id` value.
# add, remove, modify content
# create randomly named temporary file to avoid
# interference with other thread/asynchronous request
tempfile = os.path.join(os.path.dirname(filename), str(uuid.uuid4()))
with open(tempfile, 'w') as f:
json.dump(data, f, indent=4)
# rename temporary file replacing old file
os.rename(tempfile, filename)