Illegal unquoted character ((CTRL-CHAR, code 10))
Eine Zeichenkette im Dokument enthält ein wörtliches Steuerzeichen. Code 10 ist ein Zeilenumbruch, Code 13 ein Wagenrücklauf, Code 9 ein Tabulator. JSON verlangt, dass diese escapt werden, und Jackson tut recht daran, sie abzulehnen. Es ist dasselbe zugrunde liegende Problem, das V8 „bad control character“ nennt.
Fügen Sie Ihr JSON ein und sehen Sie genau, wo es bricht
Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen
Was es tatsächlich auslöst
Sortiert danach, wie oft sich das jeweilige als die Antwort herausstellt.
-
01 Mehrzeiliger Text, eingebettet in eine Zeichenkette
SQL, Stacktraces, Logzeilen und Template-Inhalte tragen alle echte Zeilenumbrüche.
Geht kaputt
{ "query": "SELECT * FROM users" }Funktioniert
{ "query": "SELECT *\nFROM users" } -
02 Durch Verkettung gebautes JSON
Interpolierte Werte werden nicht escapt. Serialisieren Sie mit ObjectMapper.writeValueAsString, statt den Text von Hand zusammenzusetzen.
Geht kaputt
String body = "{\"note\": \"" + note + "\"}";Funktioniert
String body = mapper.writeValueAsString(Map.of("note", note)); -
03 Windows-Zeilenenden innerhalb eines Werts
Der Wagenrücklauf, Code 13, ist ein eigenes Steuerzeichen und braucht \r.
Derselbe Fehler in anderen Laufzeitumgebungen
Das zugrunde liegende Problem ist identisch; nur der Wortlaut unterscheidet sich. Meldet eine Kollegin eine dieser Zeilen, sieht sie genau dasselbe wie Sie.
| JavaScript (V8) | Bad control character in string literal in JSON at position 11 (line 1 column 12) |
|---|---|
| Python | Invalid control character at: line 1 column 8 (char 7) |
Häufige Fragen
- Was ist mit ALLOW_UNESCAPED_CONTROL_CHARS?
- JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS bringt Jackson dazu, sie zu akzeptieren, und das ist eine vertretbare Notlösung, wenn Sie den Erzeuger nicht ändern können. Gültiges JSON wird das Dokument dadurch nicht, alles andere, was es konsumiert, scheitert weiterhin.
Jetzt beheben
Fügen Sie das Payload in das Werkzeug oben ein, oder gehen Sie direkt zu dem, das für diesen Zweck gebaut wurde.
Den Wert escapen