Python verwenden 2.7. Als Teil einer JSON-Antwort gibt eine API die Zeichenfolge zurück:
<a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a>
Ich verwende eine Bibliothek, die intern:
six.u(json.dumps(s))
json.dumps()
Ausgabe ist:
""<a href=\"https://about.twitter.com/products/tweetdeck\" rel=\"nofollow\">TweetDeck</a>""
Diese Ausgabe kann mit korrekt dekodiert werden json.loads
Aber der Anruf an six.u
gibt:
u""<a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a>""
Und versuchen, diese Zeichenfolge mit zu decodieren json.loads
löst einen Fehler aus.
ValueError: Extra data: line 1 column 11 - line 1 column 86 (char 10 - 85)
Sieht aus wie der Anruf an six.u
entkam der href
Wert, aber ich bin nicht ganz sicher, wie ich das beheben kann.
Antworten:
1 für die Antwort № 1six.u()
ist für gemeint Unicode-String-Literale, keine JSON-Ausgabe. Sie sollten es nicht verwenden, um den JSON in eine Unicode-Zeichenfolge zu decodieren.
Von dem six.u()
Dokumentation:
Ein "falscher" Unicode-Literal.
text
sollte immer ein normales String-Literal sein. In Python 2u()
gibt Unicode und in Python 3 einen String zurück. In Python 2 wird die Zeichenfolge auch mit der Zeichenfolge decodiertunicode-escape
Codec, der die Verwendung von Unicode-Escape-Codes ermöglicht.
Betonung meiner.
Dekodieren Sie stattdessen die Zeichenfolge, wenn Sie Python 2 verwenden:
json_string = json.dumps(s)
if hasattr(json_string, "decode"):
# Python 2; decode to a Unicode value
json_string = json_string.decode("ascii")
oder benutze die unicode()
Funktion und fangen die NameError
in Python 3:
json_string = json.dumps(s)
try:
# Python 2; decode to a Unicode value from ASCII
json_string = unicode(json_string)
except NameError:
# Python 3, already Unicode
pass
oder einstellen ensure_ascii
zu False
beim Anrufen json.dumps()
:
json_string = json.dumps(s, ensure_ascii=False)
Dies kann immer noch zurückkehren str
Geben Sie jedoch Python 2 ein, aber nur, wenn die Eingabe nur Daten enthält, die nur aus ASCII-Daten bestehen unicode
Werte.
So oder so bekommen Sie konsistente Werte zwischen Python 2 und Python 3 Das six.u()
decodiert auch decodiert uhhhh
JSON Unicode-Escape-Sequenzen zu Unicode-Codepunkten, während das Python 3-JSON-Ergebnis diese intakt lässt. Mit der Dekodierung behalten Sie die uhhhh
Sequenzen in Python 2 und 3 mit ensure_ascii
Sie erhalten in beiden Unicode-Codepunkte.
Da dies eine Drittanbieter-Bibliothek ist, habe ich einen Fehlerbericht eingereicht; Sie können sich von diesem Fehler nicht wirklich erholen. Sie können keine zusätzlichen Backslashes vorne einfügen und sie anschließend entfernen, da Sie diese nicht von normalen Backslashes unterscheiden können.