JsonParseException: Unzulässiges Zeichen ohne Anführungszeichen ((STRG-CHAR, Code 10)

93

Ich versuche, org.apache.httpcomponentseine Rest-API zu verwenden, die Daten im JSON-Format an die API sendet.

Ich bekomme diese Ausnahme:

Auslöser: com.fasterxml.jackson.core.JsonParseException: Unzulässiges Zeichen ohne Anführungszeichen ((STRG-CHAR, Code 10)): muss mit einem Backslash maskiert werden, um in die Zeichenfolge aufgenommen zu werden.

Der Grund dafür ist, dass ctrl-charin der JSON-Zeichenfolge enthalten ist.

Gibt es eine Möglichkeit, diese oder eine andere Lösung zu ersetzen?

Jian Zhong
quelle
1
Erstellen Sie den JSON selbst? Grundsätzlich klingt es so, als hätten Sie kaputte Daten ... also reparieren Sie sie entweder, wenn Sie können, oder beschweren Sie sich bei demjenigen, der sie produziert.
Jon Skeet
1
Wie in dieser StackOverflow-Antwort beschrieben , wird Ihr JSON über jsonlint.com korrekt validiert ?
Eric McCormick
Die Intellij-Idee überprüft sie, sobald Sie die .json-Datei öffnen. Versuch es!
Gaurav

Antworten:

83

Dies kann passieren, wenn Sie eine neue Zeile (oder ein anderes Steuerzeichen) in einem JSON-Zeichenfolgenliteral haben.

{"foo": "bar
baz"}

Wenn Sie die Daten erstellen, ersetzen Sie "\\n"beim Erstellen Ihrer Zeichenfolgenliterale die tatsächlichen Zeilenumbrüche durch maskierte Zeilenumbrüche .

{"foo": "bar\nbaz"}
Pyrospade
quelle
55

Verwenden von

mapper.configure(
    JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), 
    true
);

Siehe javadoc :

/**
 * Feature that determines whether parser will allow
 * JSON Strings to contain unescaped control characters
 * (ASCII characters with value less than 32, including
 * tab and line feed characters) or not.
 * If feature is set false, an exception is thrown if such a
 * character is encountered.
 *<p>
 * Since JSON specification requires quoting for all control characters,
 * this is a non-standard feature, and as such disabled by default.
 */

Die alte Option JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSwar seit 2.10 veraltet.

Siehe auch Github-Thread .

hoang
quelle
Wie implementiere ich das in XML? Ich habe <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="serializationInclusion" value="NON_NULL"/> </bean> </property> <property name="supportedMediaTypes" value="application/json"/> </bean> </mvc:message-converters> </mvc:annotation-driven> . Ich benutze Jackson 2.7. und Spring4.3.2
SudeepShakya
Warum versuchen Sie das nicht: stackoverflow.com/questions/5349362/… Oder überschreiben Sie diese Bean: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang wo ich dies in Java löschen kann, während ich versuche, diese illegalen Daten zu erfassen, habe ich die Frage gestellt, die hier stackoverflow.com/questions/49676720/… ist. Können Sie mir bitte helfen ?
Vipul Singh
danke wirklich nützlich, der Import, den ich verwendet habe, war: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

Auf der Salesforce-Plattform wird dieser Fehler durch verursacht /. Die Lösung besteht darin, diese als zu umgehen //.

Daniel Sokolowski
quelle
2
Für mich - auf der Salesforce-Plattform - wurde tatsächlich "\" bis "\\" benötigt. Zumindest in meinem Fall trat es aufgrund neuer Zeilenzeichen in meinem JSON auf. \nmusste geändert werden auf \\n. Dies liegt an der Tatsache, dass für JSON Steuerzeichen maskiert werden müssen. Sehen Sie diesen ausgezeichneten Kommentar hier .
Malte