Warum python json.dumps klagt über ascii decoding?

Ich habe die folgenden Zeilen in meinem Code

outs = codecs.getwriter('utf-8')(sys.stdout) # dJSON contains JSON message with non-ASCII chars outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val)) 

Ich bekomme die folgende Ausnahme:

  outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val)) File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/usr/lib/python2.7/json/encoder.py", line 204, in encode return ''.join(chunks) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 27: ordinal not in range(128) 

Ich durch das durch die Angabe von encoding='utf-8' in der json.dumps Anweisung, ich vermeide diese Art von Problem. Warum bekomme ich immer noch den Fehler?

  • So senden Sie JSON als Teil der multipartigen POST-Anfrage
  • Python-Sets sind nicht json serialisierbar
  • Wie lade ich das Verzeichnis der JSON-Dateien in den Apache Spark in Python
  • Wie konvertiert man csv zu hierarchischen json
  • Brauchen Sie, um Twitter-JSON-Daten zu einer Datei mit Python zu drucken
  • Wie JSON serialisieren __dict__ eines Django-Modells?
  • Liste der Objekte zu JSON mit Python
  • Wie kann ich ein numpy Array unter Beibehaltung der Matrix-Dimensionen serialisieren?
  • 2 Solutions collect form web for “Warum python json.dumps klagt über ascii decoding?”

    Meine Vermutung ist, dass das dJSON Objekt keinen reinen Unicode enthält, sondern es enthält eine Mischung aus Unicode und Strings, die bereits als utf-8 codiert sind

     >>> d = {u'name':u'पाइथन'.encode('utf-8')} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 204, in encode return ''.join(chunks) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 1: ordinal not in range(128) 

    Aber das funktioniert (alles Unicode)

     >>> d = {u'name':u'पाइथन'} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) u'{"name": "\u092a\u093e\u0907\u0925\u0928"} 

    Obwohl das auch funktioniert (alles String)

     >>> d = {'name':u'पाइथन'.encode('utf-8')} >>> json.dumps(d, encoding='utf-8', ensure_ascii=False) '{"name": "\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xa5\xe0\xa4\xa8"}' 

    Es gibt einen Workaround: Übergeben Sie die utf8 Codierung (nicht utf-8 !) Auf Dumps-Methode. In diesem Fall wird es zwingen, alle Strings zu decodieren, um unicode zuerst, und Sie können eine Mischung aus Unicode-Strings und Strings bereits als UTF-8 codiert verwenden. Warum funktioniert das? Denn es gibt so etwas im Quellcode von JSONEncoder :

     if self.encoding != 'utf-8': def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): if isinstance(o, str): o = o.decode(_encoding) return _orig_encoder(o) 

    Das ist, was wir brauchen, und es wird nicht aus der Box gehen. Aber wenn wir die Codierung auf utf8 ändern (das ist absolut das gleiche UTF-8 wie utf-8 ), zwingen wir diesen _encoder zu definieren und alles funktioniert ganz gut 🙂

    Python ist die beste Programmiersprache der Welt.