können Sie ein Objekt Haken definieren, der die Codierung für Sie tut:
>>> x = json.dumps({'a': u'\xe6', u'b': [1, 2, 3]})
>>> x
'{"a": "\\u00e6", "b": [1, 2, 3]}'
>>> json.loads(x, object_hook=no_unicode)
{'a': '\xc3\xa6', 'b': [1, 2, 3]}
Dieser Haken einfach codiert alle Schlüssel und Werte mit UTF-8 (wenn sie Strings):
def no_unicode(obj):
return {k.encode('utf8'): safe_encode(v)
for k, v in obj.iteritems()}
def safe_encode(something):
if isinstance(something, unicode):
return something.encode('utf8')
return something
Diese Lösung funktioniert jedoch nur für Strings, die direkte Mitglieder eines Objekts sind. Es wird nicht mehr funktionieren, wenn die Zeichenketten innerhalb einer Matrix/Liste verschachtelt sind:
>>> x = json.dumps({'a': [u'\xe6']})
>>> json.loads(x, object_hook=no_unicode)
{'a': [u'\xe6']}
oder wenn sie sich auf der obersten Ebene:
>>> x = json.dumps(u'\xe6')
>>> json.loads(x, object_hook=no_unicode)
u'\xe6'
Der erste Fall kann durch die Verlängerung der Haken befestigt werden rekursiv in Container absteigen und versuchen, alle gefundenen Strings zu codieren. Allerdings kann ich keinen Weg finden, den zweiten Fall zu beheben. Die json
bietet keine Hooks für andere Typen als Objekt (der Grund dafür könnte sein, dass ursprünglich die oberste Struktur eines JSON-Fragments ein Objekt sein musste).
JSON-Strings jedes Unicode-Zeichen darstellen kann, so Python 'unicode' Typ verwendet, ist die natürliche Wahl. Wenn Sie Bytes haben wollen (Python 2's 'str'), dann ist - laut dem Zen von Python - die Kodierung explizit besser, als sich auf eine implizite Zwangsumsetzung zu verlassen (wie es bei '' \ xc3 \ xa6'' im ersten Schritt der Fall ist)). – lenz
Warum willst du "str" haben? Wenn es nur das '' '- Präfix ist, das Sie ärgert, dann ist ein Upgrade auf Python 3 wahrscheinlich die beste Option. – lenz
Wie möchten Sie, dass ''\ xc3 \ xa6'' trotzdem in JSON dargestellt wird? JSON verfügt nicht über einen Byte-Typ. Ihre Optionen dekodieren also oder konvertieren in ein Array mit Ganzzahlen. – lenz