J'avais besoin d'analyser les fichiers générés par un autre outil, qui génère sans condition le fichier json avec l'en-tête UTF-8 BOM (EFBBBF). J'ai vite constaté que c'était là le problème, car le module Python 2.7 ne semble pas pouvoir l'analyser:
>>> import json
>>> data = json.load(open('sample.json'))
ValueError: No JSON object could be decoded
Supprimer la nomenclature résout le problème, mais je me demande s’il existe un autre moyen d’analyser un fichier json avec un en-tête de nomenclature?
Vous pouvez ouvrir avec codecs
:
import json
import codecs
json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))
ou décodez vous-même avec utf-8-sig
et passez à loads
:
json.loads(open('sample.json').read().decode('utf-8-sig'))
Puisque json.load(stream)
utilise json.loads(stream.read())
sous le capot, il ne sera pas mauvais d’écrire une petite fonction hepler qui encadre la nomenclature
from codecs import BOM_UTF8
def lstrip_bom(str_, bom=BOM_UTF8):
if str_.startswith(bom):
return str_[len(bom):]
else:
return str_
json.loads(lstrip_bom(open('sample.json').read()))
Dans d'autres situations où vous devez encapsuler un flux et le corriger, vous pouvez envisager d'hériter de codecs.StreamReader
.
S'il s'agit d'une solution ponctuelle, très simple et d'une technologie de pointe qui a fonctionné pour moi ...
BOOM, en-tête de nomenclature disparu!