JsonParseException: Karakter tidak dikutip ilegal ((CTRL-CHAR, kode 10)

98

Saya mencoba menggunakan org.apache.httpcomponentsuntuk menggunakan Rest API, yang akan memposting data format JSON ke API.

Saya mendapatkan pengecualian ini:

Disebabkan oleh: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 10)): harus di-escape menggunakan garis miring terbalik untuk dimasukkan dalam string.

Alasannya karena ctrl-chartermasuk dalam string JSON.

Apakah ada cara untuk mengganti ini atau solusi lain?

jian zhong
sumber
1
Apakah Anda membuat JSON sendiri? Pada dasarnya, sepertinya Anda memiliki data yang rusak ... jadi perbaiki jika Anda bisa, atau komplain kepada siapa pun yang memproduksinya.
Jon Skeet
1
Seperti yang dibahas dalam jawaban StackOverflow ini , apakah JSON Anda memvalidasi dengan benar melalui jsonlint.com ?
Eric McCormick
Ide Intellij memvalidasinya segera setelah Anda membuka file .json. Cobalah!
Gaurav

Jawaban:

88

Ini bisa terjadi jika Anda memiliki baris baru (atau karakter kontrol lain) dalam literal string JSON.

{"foo": "bar
baz"}

Jika Anda adalah orang yang menghasilkan data, ganti baris baru yang sebenarnya dengan yang lolos "\\n"saat membuat literal string Anda.

{"foo": "bar\nbaz"}
pyrospade
sumber
58

Menggunakan

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

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

Opsi lama JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARStidak digunakan lagi sejak 2.10.

Silakan lihat juga benang github .

hoang
sumber
bagaimana menerapkan ini dalam xml? Saya memiliki <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> . Saya menggunakan Jackson 2.7. dan Spring4.3.2
SudeepShakya
Mengapa Anda tidak mencoba ini: stackoverflow.com/questions/5349362/… Atau menimpa kacang itu: MappingJackso‌ n2HttpMessageConvert‌ er
hoang
@hoang di mana untuk menghapus ini di java saat saya mencoba untuk menangkap data ilegal ini, saya telah mengajukan pertanyaan yang ada di sini stackoverflow.com/questions/49676720/… , dapatkah Anda membantu saya.
Vipul Singh
terima kasih sangat berguna, impor yang saya gunakan adalah: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez
1

Pada platform Salesforce, kesalahan ini disebabkan oleh /, solusinya adalah menghindari kesalahan ini sebagai //.

Daniel Sokolowski
sumber
2
Bagi saya - di platform Salesforce - "\" hingga "\\" yang benar-benar dibutuhkan. Setidaknya dalam kasus saya itu terjadi karena karakter baris baru di JSON saya. \nharus diubah menjadi \\n. Ini karena fakta bahwa JSON memerlukan karakter kontrol untuk di-escape. Lihat komentar luar biasa ini di sini .
malte