JsonParseException: Ký tự không được trích dẫn bất hợp pháp ((CTRL-CHAR, mã 10)


94

Tôi đang cố gắng sử dụng để sử dụng org.apache.httpcomponentsAPI Rest, API này sẽ đăng dữ liệu định dạng JSON lên API.

Tôi nhận được ngoại lệ này:

Gây ra bởi: com.fasterxml.jackson.core.JsonParseException: Ký tự không được trích dẫn bất hợp pháp ((CTRL-CHAR, mã 10)): phải được thoát bằng cách sử dụng dấu gạch chéo ngược để được đưa vào chuỗi.

Lý do là vì ctrl-charđược bao gồm trong chuỗi JSON.

Có cách nào để thay thế này hoặc một số giải pháp khác không?


1
Bạn có đang tự tạo JSON không? Về cơ bản, có vẻ như bạn có dữ liệu bị hỏng ... vì vậy hãy sửa nó nếu bạn có thể, hoặc phàn nàn với bất kỳ ai đang sản xuất nó.
Jon Skeet,

1
Như đã thảo luận trong câu trả lời StackOverflow này , JSON của bạn có xác thực chính xác qua jsonlint.com không?
Eric McCormick

Ý tưởng Intellij xác thực nó ngay khi bạn mở tệp .json. Thử nó!
Gaurav

Câu trả lời:


84

Điều này có thể xảy ra nếu bạn có một dòng mới (hoặc ký tự điều khiển khác) trong một chuỗi JSON.

{"foo": "bar
baz"}

Nếu bạn là người tạo ra dữ liệu, hãy thay thế các dòng mới thực tế bằng các dòng "\\n"sau khi tạo chuỗi ký tự của bạn.

{"foo": "bar\nbaz"}

56

Sử dụng

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

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

Tùy chọn cũ JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARSkhông được dùng nữa kể từ ngày 2.10.

Vui lòng xem thêm chủ đề github .


làm thế nào để thực hiện điều này trong xml? Tôi có <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> . Tôi đang sử dụng Jackson 2.7. và Spring4.3.2
SudeepShakya

Tại sao bạn không thử cái này: stackoverflow.com/questions/5349362/… Hoặc ghi đè đậu đó: MappingJackso‌ n2HttpMessageConvert‌ er
hoang

@hoang xóa điều này ở đâu trong java vì tôi đang cố gắng lấy dữ liệu bất hợp pháp này, tôi đã đặt câu hỏi ở đây stackoverflow.com/questions/49676720/… , bạn có thể giúp tôi không.
Vipul Singh

cảm ơn thực sự hữu ích, nhập tôi đã sử dụng là: com.fasterxml.jackson.core.JsonParser.Feature;
Jesús Sánchez

1

Trên nền tảng Salesforce lỗi này là do gây ra /, giải pháp là thoát khỏi những lỗi này như //.


2
Đối với tôi - trên nền tảng Salesforce - nó thực sự cần thiết "\" thành "\\". Ít nhất là trong trường hợp của tôi, nó đã xảy ra do các ký tự dòng mới trong JSON của tôi. \nđã được thay đổi thành \\n. Điều này là do JSON yêu cầu các ký tự điều khiển phải được thoát. Xem bình luận xuất sắc này ở đây .
malte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.