Próbuję użyć org.apache.httpcomponents
Rest 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-char
jest zawarty w ciągu JSON.
Czy jest jakiś sposób na zastąpienie tego lub innego rozwiązania?
java
json
character-encoding
apache-httpclient-4.x
jian zhong
źródło
źródło
Odpowiedzi:
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"}
źródło
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_CHARS
została wycofana od 2.10.Zobacz także wątek github .
źródło
<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.2com.fasterxml.jackson.core.JsonParser.Feature;
Na platformie Salesforce ten błąd jest spowodowany przez
/
, rozwiązaniem jest uniknięcie ich jako//
.źródło
\n
musiał zostać zmieniony na\\n
. Wynika to z faktu, że JSON wymaga zmiany znaczenia znaków sterujących. Zobacz ten doskonały komentarz tutaj .