TAB kann in JSON-Dateien nicht analysiert werden
Habe ich ein parsing-problem beim laden von JSON-Dateien, die zu haben scheinen, die REGISTERKARTE Charakter in Ihnen.
Wenn ich http://jsonlint.com/, und ich geben Sie den Teil mit der TAB-Zeichen:
{
"My_String": "Foo bar. Bar foo."
}
Der validator beschwert sich mit:
Parse error on line 2:
{ "My_String": "Foo bar. Bar foo."
------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
Wahrsten Sinne des Wortes ein copy/paste des betreffenden JSON-text.
Ich habe versucht, laden Sie diese Datei mit json
und simplejson
ohne Erfolg. Wie kann ich laden Sie diese richtig? Sollte ich einfach vor der Verarbeitung der Datei, und ersetzen Sie die REGISTERKARTE durch \t
oder von einem Raum? Oder gibt es etwas, dass ich hier vermisst?
Update:
Hier ist auch ein problematisches Beispiel in simplejson
:
foo = '{"My_string": "Foo bar.\t Bar foo."}'
simplejson.loads(foo)
JSONDecodeError: Invalid control character '\t' at: line 1 column 24 (char 23)
InformationsquelleAutor der Frage Josh | 2013-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom JSON-standard:
Bedeutet es, dass eine wörtliche tab-Zeichen ist nicht erlaubt in einen JSON-string. Sie müssen, um es zu entkommen, als
\t
(in einem .json-Datei):Zusätzlich, wenn json-text ist im inneren ein in Python string-literal ist, dann müssen Sie Doppel-escape-tab:
Oder verwenden Sie ein Python-raw-string-Literale:
InformationsquelleAutor der Antwort jfs
Tabs sind legal als Trennzeichen whitespace außerhalb der Werte, aber nicht innerhalb von Zeichenketten. Verwenden
\t
statt.EDIT: Basierend auf Ihre Kommentare, ich sehe einige Verwirrung darüber, was ein tab ist eigentlich..
das tab-Zeichen ist nur ein normaler Charakter, wie ein 'a' oder '5' oder '.' oder andere Zeichen, die Sie eingeben, durch drücken einer Taste auf Ihrer Tastatur. Es dauert, bis ein einzelnes byte, dessen numerischer Wert 9. Es gibt keine umgekehrten Schrägstriche oder Kleinbuchstaben 't' s beteiligt.
Was bringt Registerkarte in eine andere Kategorie von 'a' oder '5' oder '.' ist die Tatsache, dass Sie als Mensch mit Ihren Augäpfel, in der Regel nicht Blick auf eine Anzeige von text und Identifizierung oder Zählung tab-Zeichen. Optisch eine Sequenz von Registerkarten ist identisch zu einer Sequenz von (meist größeren, aber immer noch visuell unbestimmte Anzahl) Räume.
Um eindeutig repräsentieren tabs im text bedeutete für die EDV, wir haben verschiedene syntaktische Methoden, um zu sagen: "Hey, einige Stück software! Ersetzen Sie diese junk-E-mit einem tab-Zeichen, später, OK?".
In der Geschichte der Programmiersprachen gab es hauptsächlich zwei Ansätze, die, wenn Sie gehen zurück auf die 1950 ' s, Sie bekommen beide Ansätze bestehende nebeneinander, eine in jeder von zwei der ältesten high-level-Sprachen. Lisp genannt hatte, Zeichen-Literale wie
#\Tab
; diese wurden umgewandelt, sobald Sie gelesen wurden, aus dem Programm-Quellcode. Fortran hatte nur dieCHAR
- Funktion, was zur Laufzeit aufgerufen und gab das Zeichen, deren Anzahl entsprach dem argument:CHAR(9)
zurückgegeben tab. (Natürlich, wenn es wirklichCHAR(9)
und nichtCHAR(
einigen Ausdruck, der funktioniert bis 9)
, ein optimierender compiler könnte bemerken, dass und ersetzen Sie die Funktion rufen Sie mit tab zur compile-Zeit, setzen uns wieder in das andere Lager.)Im Allgemeinen, mit beiden lösungsarten, wenn Sie wollte-stick, den besonderen Charakter innerhalb einer größeren Zeichenfolge, die Sie zu tun hatten, ist die Verkettung selbst, zum Beispiel, ein Kind hacking BASIC in den 80er Jahren vielleicht schreiben Sie etwas wie dieses:
Aber einige Sprachen, insbesondere die Familie, die begann mit der Sprache, B - die Möglichkeit eingeführt, diese Zeichen direkt in ein string-literal:
BCPL behielt die
*
syntax, aber die nächste Sprache in der Serie C, ersetzt es mit dem umgekehrten Schrägstrich, wahrscheinlich, weil Sie benötigt, um Lesen und schreiben wörtliche Sternchen viel öfter als Literale umgekehrte Schrägstriche.Jedenfalls gibt es eine ganze Reihe von Sprachen, darunter Python und Javascript, geliehen oder geerbt, C ' s Konventionen hier. Also in beiden Sprachen, sind die beiden Ausdrücke
"\t"
und'\t'
jedes Ergebnis in einen ein-Zeichen-string, wo ein Zeichen ist ein tab.JSON basiert auf Javascript-syntax, aber es erlaubt nur eine eingeschränkte Teilmenge. Zum Beispiel, strings werden in doppelte Anführungszeichen eingeschlossen (
"
) anstelle der einzigen ('
), und wörtliche tabs sind nicht erlaubt im inneren.Das bedeutet, dass diese Python-string aus deinem update:
ist kein gültiges JSON. Der Python-interpreter stellt die
\t
Sequenz in einem aktuellen tab-Zeichen, sobald es liest die string - lange bevor das JSON-Prozessor jemals sieht.Können Sie sagen, Python setzen eine wörtliche
\t
im string statt eines tab-Zeichens durch die Verdoppelung der backslash:Oder Sie können die "raw" - string-syntax, die nicht interpretieren die Besondere backslash-Sequenzen an alle:
So oder so, die JSON-Prozessor wird eine Zeichenfolge mit einem backslash, gefolgt von einem 't', sondern als ein string, der einen tab.
InformationsquelleAutor der Antwort Mark Reed
Können Sie Registerkarten innerhalb Werte (statt whitespaces) in JSON-Dateien von Ihnen zu entkommen. Hier ist ein funktionierendes Beispiel mit der
json
Modul in Python2.7:Zwar nicht die Flucht der
'\t'
einen Fehler verursacht:InformationsquelleAutor der Antwort mdml
Nur um meine Erfahrung zu teilen:
Ich bin mit snakemake und eine config-Datei geschrieben, die in Json. Es gibt tabs, die in der json-Datei für die Einrückung. TAB-legal für diesen Zweck. Aber ich erhalte eine Fehlermeldung: snakemake.Ausnahmen.WorkflowError: Config-Datei ist nicht gültige JSON oder YAML. Ich glaube, das ist ein Fehler von snakemake; aber ich könnte falsch sein. Bitte kommentieren. Nach dem ersetzen alle TABs mit Leerzeichen, die Fehlermeldung ist Weg.
InformationsquelleAutor der Antwort Kemin Zhou
In der node-red flow ich die Verkleidung gleichen Art von problem:
Fehler:
Lösung:
fügte ich in nur
\\t
im code.InformationsquelleAutor der Antwort KARTHIKEYAN.A