JSON Problem mit dem Encoding

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blubbersuelze
User
Beiträge: 20
Registriert: Samstag 11. Juli 2015, 17:54

Hallo zusammen,

ich habe ein Problem mit JSON in Verbindung mit UTF-8, zumindest scheint es mit UTF-8 zu sein.
Es werden manche Zeichen nicht sauber decodiert, bzw. so von json interpretiert das es ein ungültiges JSON ist.
Der entsprechende kritische Abschnitt im JSON sieht wie folgt aus:

Code: Alles auswählen

            "language" : "rf ",
        "rating" : "unknown"
        },
        {
            "language" : "ise",
        "rating" : "unknown"
        },
        {
            "language" : "N´^Q",
        "rating" : "unknown"
        },
        {
            "language" : "eu^@",
        "rating" : "unknown"
        },
        {
            "language" : "^Eti",
        "rating" : "unknown"
        },
lasse ich den JSON Parser diesen JSON Stream analysieren, so schlägt dies fehl und es werden hauptsächlich fehlende " bemängelt, oft aber auch generell Zeichen mit denen simplejson nichts anfangen kann.

Python sieht folgendes jedoch (ich zeige hier nur die von json.loads bemängelten Bereiche):

Code: Alles auswählen

                       "language" : " "F",
                "rating" : "unknown",
...
language" : "u\",
                "rating" : "unknown",
...
                        "language" : "�"@",
                "rating" : "unknown"
der betreffende Code dazu sieht wie folgt aus:

Code: Alles auswählen

decoded_json_stream = stream_content.decode(encoding='UTF-8', errors='replace')
datastream = json.loads(decoded_json_stream, strict=False)
Nach dem was Python erkennt, ist es leider selbstredend das json.loads fehl schlägt.
Ich denke das es ein Problem mit dem Encoding ist, denn das ursprüngliche JSON ist noch korrekt, bis auf das diverse Zeichen nicht korrekt dargestellt werden. Doch die Interpretation in Python ist dann leider jedoch fehlerhaft.
Weiß jemand eine Lösung das json.loads nicht mehr fehl schlägt, und idealerweise das Encodingproblem auch gelöst wird?

danke im voraus
blubbersuelze :P
BlackJack

@blubbersuelze: Ich werde da ehrlich nicht so ganz schlau aus der Fehlerbeschreibung.

Wenn Du ``errors='replace'`` angeben musst damit keine Ausnahme ausgelöst wird, dann ist das schlicht kein UTF-8 und Du musst herausfinden was es tatsächlich ist und *das* dann angeben.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@blubbersuelze: das JSON sieht ganz allgemein kaputt aus. Woher hast Du das? Länderkürzel enthalten im allgemeinen keine Sonderzeichen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

blubbersuelze hat geschrieben:Hallo zusammen,

ich habe ein Problem mit JSON in Verbindung mit UTF-8, zumindest scheint es mit UTF-8 zu sein.
Es werden manche Zeichen nicht sauber decodiert, bzw. so von json interpretiert das es ein ungültiges JSON ist.
Was es ist und was es nicht ist, ist die Frage.

Normalerweise hat man am Anfang Python oder etwas anderes. Mit json.dumps wird das nach JSON gewandelt. Wenn man es dann als Bytestream schicken will, dann wird es mit bytes(json_message,'utf-8') oder ein anderes Format nach Bytes gewandelt und übertragen. Wenn es übertragen ist, wird der entsprechende Teil des Bytearrays wieder in String gewandelt, etwa str(json_bytes,'utf-8') und dann geht normalerweise json.loads.

Wenn da Kodierung und Dekodierung nicht übereinstimmen, dann gibt es ein Problem. Also musst Du genau wissen, was es ist, ob utf-8 oder etwas anderes oder das Ursprüngliche falsch dekodiert wurde, sodass es nicht mehr stimmt, vielleicht in einen File als unicode oder als ascii gespeichert? Irgendwo muss da wohl ein Wurm hineingekommen sein.

Und wie kommst Du darauf, dass dieser Code JSON wäre. Das schaut doch wie Python Source Code aus, also eine Liste, bestehend aus Python Dictionaries. Das solltest Du lieber als Script einlesen.

Was bedeutet etwa language "ise"? ist das Italian Sign Language: https://www.ethnologue.com/language/ise

Wenn Du eine Vorstellung hast, was das bedeuten soll, kommst Du vielleicht darauf, was es sein soll und kannst es dann entsprechend dekodieren.

Und bei json.loads kannst Du auch ein encoding eingeben:

json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
Antworten