2016-04-15 4 views
2

Возникает проблема при разборе строки JSON с Джексоном в некоторых случаях.Неожиданный символ ('' (код 92)) в jackson

String jsonString = "{\"Age\":40, \"Name\":\"Sample User\"}"; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(jsonString,JsonNode.class); 

System.out.println(jsonstirng) 
{"Age":40, "Name":"Sample User"} 

Над кодом хорошо работает, когда я прохожу jsonString значение.

В некоторых случаях мне нужно, чтобы избежать недопустимых символов строки, как ",' и т.д.

Для побега я использую ApacheStringEscapeUtils.

String escapedString = StringEscapeUtils.escapeJson(jsonStirng); 

Сбежал выход Строка

{\"Age\":40,\"Name\":\"Sample User\"} 

Когда я прохожу escapedString к mapper его броска Неожиданное исключение символов.

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(escapedString,JsonNode.class); 

Исключение

Unexpected character ('\' (code 92)): was expecting double-quote to start field name 

На самом деле Am разборе журналов аудита ModSecurity. Тело ответа в журнале аудита имеет (html, css, javascript и т. Д.) Материал, поэтому мне нужно избегать строки JSON, иначе он разрывает формат JSON.

+0

Почему вы избегаете цитат в этой строке? Настоящая строка Json не должна иметь экранов. Распечатайте 'jsonString', который у вас есть в вашей первой строке, и вы увидите, что внутри он не имеет возможности экранирования. – RealSkeptic

+0

Вопрос имеет очень запутанное описание, он даже не компилируется и не ускользает от магических изменений. Возраст от 40 до 33. Проверьте и покажите реальный код. Но я мог только предположить, что вы цитируете что-то неправильно. – kan

+0

@kan typo ошибка. Теперь обновите его, любезно посмотрите. –

ответ

2

Цель экранирования строки - сделать ее неотъемлемой частью куска JSON.

В вашем случае вы заменяете все " на \", чтобы его можно было использовать внутри значения строки, и синтаксический анализатор НЕ будет рассматривать его как часть JSON.

например. это всего лишь одно поле и ценность;

"myJson": "{\"Age\":40,\"Name\":\"Sample User\"}" 

то, что вы не можете сделать, следующее: именно поэтому вам нужен этот метод. Он не может отличить ", который запускает/завершает строку и " внутри строки.

"myJson": "{"Age":40,"Name":"Sample User"}" 

Если вы попытаетесь разобрать эту экранированную строку, она не сможет ее проанализировать.


EDIT: Вот пример,

String text = "{\"Age\":40,\"Name\":\"Sample User\"}"; 
String escaped = StringEscapeUtils.escapeJson(text); 
System.out.println("escaped= " + escaped); 
String unescaped = StringEscapeUtils.unescapeJson(escaped); 
System.out.println("unescaped= " + unescaped); 

печатает

escaped= {\"Age\":40,\"Name\":\"Sample User\"} 
unescaped= {"Age":40,"Name":"Sample User"} 

вы можете увидеть, что сбежавший строка имеет \" однако неэкранированный строка не делает. Если вы все еще видите \, я бы предположил, что String не был отменен.

+0

На самом деле анализирует журналы аудита ModSecurity с помощью джексона. Я также получаю ответный заголовок и тело ответа. Тело ответа имеет (html, css, javascript и т. Д.), Поэтому мне нужно избегать json string other wise, который прерывает формат json. –

+0

@basitraza согласился, побег для безопасного размещения строки внутри значения. Чтобы разобрать такую ​​строку, вы должны сначала ее отменить, чтобы отменить то, что она делает. Примечание. Существует несколько способов избежать строки, поэтому лучше всего использовать соответствующий unescape –

+0

, который вы рекомендуете в этом сценарии. Я попробовал разные шаблоны экранирования, но ничего не изменилось. Исключение одиночной цитаты '' 'работает в некоторых случаях, но не во всех. –

Смежные вопросы