JsonParseException: carattere non quotato non valido ((CTRL-CHAR, codice 10)


94

Sto cercando di utilizzare org.apache.httpcomponentsun'API Rest, che invierà i dati in formato JSON all'API.

Ottengo questa eccezione:

Causato da: com.fasterxml.jackson.core.JsonParseException: carattere non quotato non quotato ((CTRL-CHAR, codice 10)): deve essere sottoposto a escape utilizzando la barra rovesciata per essere incluso nella stringa.

Il motivo è perché ctrl-charè incluso nella stringa JSON.

C'è un modo per sostituire questa o qualche altra soluzione?


1
Stai creando tu stesso il JSON? Fondamentalmente, sembra che tu abbia dati danneggiati ... quindi aggiustalo se puoi o lamentati con chiunque lo stia producendo.
Jon Skeet

1
Come discusso in questa risposta StackOverflow , il tuo JSON viene convalidato correttamente tramite jsonlint.com ?
Eric McCormick

L'idea di Intellij lo convalida non appena apri il file .json. Provalo!
Gaurav

Risposte:


84

Questo può accadere se hai una nuova riga (o un altro carattere di controllo) in una stringa letterale JSON.

{"foo": "bar
baz"}

Se sei tu a produrre i dati, sostituisci i newline effettivi con quelli con escape "\\n"quando crei i tuoi stringhe letterali.

{"foo": "bar\nbaz"}

56

Utilizzando

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

Vedi 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.
 */

La vecchia opzione è JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSstata deprecata dalla 2.10.

Si prega di vedere anche thread github .


come implementarlo in xml? Ho <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> . Sto usando Jackson 2.7. e primavera4.3.2
SudeepShakya

Perché non provi questo: stackoverflow.com/questions/5349362/… O sovrascrivendo quel bean: MappingJackso‌ n2HttpMessageConvert‌ er
hoang

@hoang dove per delare questo in java mentre sto cercando di catturare questi dati illegali, ho posto la domanda che è qui stackoverflow.com/questions/49676720/… , puoi per favore aiutarmi.
Vipul Singh

grazie davvero utile, l'importazione che ho usato è stata: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez

1

Sulla piattaforma Salesforce questo errore è causato da /, la soluzione è sfuggirli come //.


2
Per me, sulla piattaforma Salesforce, era effettivamente necessario "\" su "\\". Almeno nel mio caso si è verificato a causa di nuovi caratteri di riga nel mio JSON. \ndoveva essere cambiato in \\n. Ciò è dovuto al fatto che JSON richiede l'escape dei caratteri di controllo. Vedi questo eccellente commento qui .
malte
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.