JsonParseException: Niedozwolony znak bez cudzysłowu ((CTRL-CHAR, kod 10)

97

Próbuję użyć org.apache.httpcomponentsRest API, które będzie wysyłać dane w formacie JSON do API.

Mam ten wyjątek:

Spowodowany przez: com.fasterxml.jackson.core.JsonParseException: Niedozwolony znak bez cudzysłowu ((CTRL-CHAR, kod 10)): musi zostać zmieniony za pomocą odwrotnego ukośnika, aby został uwzględniony w ciągu.

Powodem jest to, że ctrl-charjest zawarty w ciągu JSON.

Czy jest jakiś sposób na zastąpienie tego lub innego rozwiązania?

jian zhong
źródło
1
Czy sam tworzysz JSON? Zasadniczo brzmi to tak, jakbyś miał zepsute dane ... więc albo napraw to, jeśli możesz, albo złóż skargę temu, kto je produkuje.
Jon Skeet,
1
Jak omówiono w tej odpowiedzi na StackOverflow , czy Twój JSON jest poprawnie weryfikowany przez jsonlint.com ?
Eric McCormick
Intellij idea sprawdza poprawność, gdy tylko otworzysz plik .json. Spróbuj!
Gaurav

Odpowiedzi:

86

Może się tak zdarzyć, jeśli masz znak nowej linii (lub inny znak kontrolny) w literale ciągu JSON.

{"foo": "bar
baz"}

Jeśli to ty tworzysz dane, zamień rzeczywiste znaki nowej linii na znaki ze znakami ucieczki "\\n"podczas tworzenia literałów ciągów.

{"foo": "bar\nbaz"}
pirospada
źródło
58

Za pomocą

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

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

Stara opcja JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSzostała wycofana od 2.10.

Zobacz także wątek github .

Hoang
źródło
jak zaimplementować to w xml? Mam <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> . Używam Jacksona 2.7. i Wiosna4.3.2
SudeepShakya
Dlaczego nie spróbujesz tego: stackoverflow.com/questions/5349362/ ... Lub zastąpienie tego ziarna: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang gdzie to usunąć w java, ponieważ próbuję uchwycić te nielegalne dane, zadałem pytanie, które jest tutaj stackoverflow.com/questions/49676720/ ... , czy możesz mi pomóc.
Vipul Singh
dzięki naprawdę przydatne, import, którego użyłem, to: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

Na platformie Salesforce ten błąd jest spowodowany przez /, rozwiązaniem jest uniknięcie ich jako //.

Daniela Sokołowskiego
źródło
2
Dla mnie - na platformie Salesforce - to było „\” do „\\”, które było faktycznie potrzebne. Przynajmniej w moim przypadku wystąpiło to z powodu znaków nowego wiersza w moim JSON. \nmusiał zostać zmieniony na \\n. Wynika to z faktu, że JSON wymaga zmiany znaczenia znaków sterujących. Zobacz ten doskonały komentarz tutaj .
malte