- экранирование кавычек в java json
- 1 ответы
- Экранировать строку JSON в Java
- 2. Что могло пойти не так?
- 3. Библиотека JSON-java
- 4. Библиотека Джексона
- 5. Библиотека Гуавы
- 6. Заключение
- Популярные посты
- Gson — Автоматическое экранирование кавычек («)?
- 4 ответа
- Escape JSON String in Java
- 2. Что может пойти не так?
- 3. JSON-Java-библиотека
- 4. Библиотека Джексона
- 5. Библиотека гуавы
- 6. Заключение
- ИТ-записки Чорнага кашака
экранирование кавычек в java json
но когда я проверяю в Firebug, что отправлено, я вижу, что обратная косая черта не удаляется:
Любые идеи? я пробовал с ls.replaceAll(«\\\\», » «); но это не работает
Это странно, в любом случае попробуй ls.replaceAll(«\\»,»»); (в противном случае он заменит только две обратные косые черты подряд..) — ddmps
ls.replaceAll(«\\»,»»); дает regexsyntaxException — adaniluk
Да, верно, мой плохой. ты делаешь ls = ls.replaceAll(«\\\\,»») , иначе он не сохранит его в ls. — ddmps
да, я сохраняю его в другую переменную, странно, что посылаются люфты — adaniluk
1 ответы
Какую библиотеку JSON вы используете? Мне кажется, что вы правильно строите такие строки, как
но потом их вставить как струны в некоторую структуру, которая сериализуется библиотекой JSON. Затем сериализатор JSON должен повторно экранировать кавычки, чтобы преобразовать результат в допустимый строковый литерал JSON.
Изменить: вы говорите, что используете Gson, поэтому я предполагаю, что у вас есть класс верхнего уровня, который вы сериализуете, который в настоящее время имеет String rows свойство, которое вы заполняете строкой JSON. Вместо этого вам нужно создать новый класс для представления одной строки
class Row < private String id; private Listcell; // constructor, getters and setters as usual >
И измените свойство rows на List . Теперь вместо того, чтобы объединять строки для самостоятельного создания JSON, вы просто заполняете свой объект верхнего уровня соответствующими Row объектов и позволить Gson преобразовать их в JSON.
ответ дан 30 мар ’13, в 10:03
Экранировать строку JSON в Java
В этом коротком руководстве мы покажем несколько способов избежать строки JSON в Java.
Мы кратко рассмотрим самые популярные библиотеки обработки JSON и то, как они упрощают экранирование.
2. Что могло пойти не так?
Давайте рассмотрим простой, но распространенный вариант использования отправки определенного пользователем сообщения в веб-службу. Наивно, мы могли бы попробовать:
String payload = ""; sendMessage(payload);
Но на самом деле это может вызвать множество проблем.
Самый простой — если сообщение содержит цитату:
Хуже того, пользователь может сознательно нарушить семантику запроса . Если он отправит:
Самый простой подход — заменить кавычки соответствующей escape-последовательностью:
Однако этот подход довольно хрупкий:
- Это нужно делать для каждого конкатенированного значения , и мы всегда должны помнить, какие строки мы уже экранировали.
- Более того, поскольку структура сообщения со временем меняется, это может стать головной болью при обслуживании.
- И его трудно читать, что делает его еще более подверженным ошибкам
Проще говоря, нам нужно использовать более общий подход. К сожалению, собственные функции обработки JSON все еще находятся на этапе JEP , поэтому нам придется обратить внимание на различные библиотеки JSON с открытым исходным кодом.
К счастью, существует несколько библиотек обработки JSON. Давайте кратко рассмотрим три самых популярных.
3. Библиотека JSON-java
Самая простая и маленькая библиотека в нашем обзоре — это JSON-java, также известная как org.json .
Чтобы создать объект JSON, мы просто создаем экземпляр JSONObject и в основном рассматриваем его как карту :
JSONObject jsonObject = new JSONObject(); jsonObject.put("message", "Hello \"World\""); String payload = jsonObject.toString();
Это возьмет кавычки вокруг «Мира» и ускользнет от них:
4. Библиотека Джексона
Одна из самых популярных и универсальных библиотек Java для обработки JSON — это Jackson.
На первый взгляд, Джексон ведет себя аналогично org.json :
Map params = new HashMap(); params.put("message", "Hello \"World\""); String payload = new ObjectMapper().writeValueAsString(params);
Однако Джексон также может поддерживать сериализацию объектов Java.
Итак, давайте немного улучшим наш пример, заключив наше сообщение в специальный класс:
class Payload < Payload(String message) < this.message = message; >String message; // getters and setters >
Затем нам понадобится экземпляр ObjectMapper, которому мы можем передать экземпляр нашего объекта:
String payload = new ObjectMapper().writeValueAsString(new Payload("Hello \"World\""));
В обоих случаях получаем тот же результат, что и раньше:
В случаях, когда у нас уже есть экранированное свойство и нам нужно сериализовать его без дальнейшего экранирования, мы можем использовать аннотацию Джексона @JsonRawValue для этого поля.
5. Библиотека Гуавы
Gson — это библиотека от Google, которая часто идет вразрез с Джексоном.
Конечно, мы можем сделать то же самое, что и с org.json :
JsonObject json = new JsonObject(); json.addProperty("message", "Hello \"World\""); String payload = new Gson().toJson(gsonObject);
Или мы можем использовать пользовательские объекты, как с Джексоном:
String payload = new Gson().toJson(new Payload("Hello \"World\""));
И мы снова получим тот же результат.
6. Заключение
В этой короткой статье мы увидели, как избежать строк JSON в Java, используя различные библиотеки с открытым исходным кодом.
Весь код, относящийся к этой статье, можно найти на Github.
Популярные посты
Gson — Автоматическое экранирование кавычек («)?
Я использую GSON на своем сервере Java EE, чтобы предоставить представлениям json. В каком-то объекте у меня есть длинный текст, который может содержать что угодно (например, «Какая« отличная »новость!»).
Я удивлен, что по умолчанию GSON не избегает двойных кавычек, поэтому он не генерирует действительный JSON.
Есть хороший способ сделать это?
4 ответа
Возможно, я не понимаю ваш вопрос, но мне удалось заставить GSON обрабатывать строки с кавычками без каких-либо настроек или изменений.
import com.google.gson.Gson; public class GSONTest < public String value; public static void main(String[] args) < Gson g = new Gson(); GSONTest gt = new GSONTest(); gt.value = "This is a \"test\" of quoted strings"; System.out.println("String: " + gt.value); System.out.println("JSON: " + g.toJson(gt)); >>
String: This is a "test" of quoted strings JSON:
Может я не понимаю, о чем вы спрашиваете?
Да извините вы правы! С запросом от моего браузера (набрав URL) я получаю действительный JSON. Но когда я получаю JSON с Javascript, с jQuery jsonP, escape-символы удаляются. Это действительно странно.
Пиетт: Разве вы не видите строку как прочитанную Javascript, то есть после отмены экранирования? ИМХО, сам факт того, что вы смогли получить объект в Javascript, означает, что он был правильно сформирован JSON.
Вам может понадобиться этот код для правильной обработки двойной кавычки: Gson gson = new GsonBuilder().disableHtmlEscaping().create();
Спасибо sunghun Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); Эта строка исправит это.
Попробуйте использовать setPrettyPrinting с экранированием DisableHtml.
import com.google.gson.Gson; Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(jsonArray.toString()); System.out.println( gson.toJson(je));
Gson gson = новый GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); заставил его работать в моем преобразователе типов для LIst . Вы спасли мой день. Спасибо.
Escape JSON String in Java
В этом коротком руководстве мы покажем несколько способов избежать использования строки JSON в Java.
Мы кратко рассмотрим самые популярные библиотеки JSON-обработки и то, как они позволяют избежать простой задачи.
2. Что может пойти не так?
Давайте рассмотрим простой, но распространенный вариант использования отправки пользовательского сообщения в веб-сервис. Наивно, мы могли бы попробовать:
String payload = ""; sendMessage(payload);
Но на самом деле это может создать много проблем.
Самое простое, если сообщение содержит цитату:
Хужеthe user can knowingly break the semantics of the request. Если он отправляет:
Тогда сообщение становится:
Самый простой подход — заменить кавычки соответствующей escape-последовательностью:
Однако такой подход довольно хрупок:
- It needs to be done for every concatenated value, и нам всегда нужно помнить, какие строки мы уже экранировали
- Более того, поскольку структура сообщения меняется со временем,this can become a maintenance headache
- И этоhard to read, making it even more error-prone
Проще говоря, нам нужно использовать более общий подход. К сожалению,native JSON processing features are still in the JEP phase, поэтому нам придется обратить внимание на различные библиотеки JSON с открытым исходным кодом.
К счастью, есть библиотеки обработки JSONseveral. Давайте кратко рассмотрим три самых популярных.
3. JSON-Java-библиотека
Самая простая и маленькая библиотека в нашем обзоре -JSON-java, также известная какorg.json.
Чтобы создать объект JSON,we simply create an instance of JSONObject and basically treat it like a Map:
JSONObject jsonObject = new JSONObject(); jsonObject.put("message", "Hello \"World\""); String payload = jsonObject.toString();
Это возьмет кавычки вокруг «Мира» и избежит их:
4. Библиотека Джексона
Одна из самых популярных и универсальных библиотек Java для обработки JSON -Jackson.
На первый взглядJackson behaves similarly to org.json:
Map params = new HashMap<>(); params.put("message", "Hello \"World\""); String payload = new ObjectMapper().writeValueAsString(params);
Однако Джексон также может поддерживать сериализацию объектов Java.
Итак, давайте немного улучшим наш пример, заключив наше сообщение в специальный класс:
class Payload < Payload(String message) < this.message = message; >String message; // getters and setters >
Затем нам нужен экземплярObjectMapper, которому мы можем передать экземпляр нашего объекта:
String payload = new ObjectMapper().writeValueAsString(new Payload("Hello \"World\""));
В обоих случаях мы получаем тот же результат, что и раньше:
В случаях, когда у нас уже есть экранированное свойство и нам нужно сериализовать его без дальнейшего экранирования, мы можем использовать аннотацию Джексона@JsonRawValue для этого поля.
5. Библиотека гуавы
Gson — это библиотека от Google, которая часто используетgoes head to head with Jackson.
Конечно, мы можем поступить так же, как сorg.json again:
JsonObject json = new JsonObject(); json.addProperty("message", "Hello \"World\""); String payload = new Gson().toJson(gsonObject);
Или мы можем использовать пользовательские объекты, как с Джексоном:
String payload = new Gson().toJson(new Payload("Hello \"World\""));
И мы снова получим тот же результат.
6. Заключение
В этой короткой статье мы увидели, как избежать строк JSON в Java с помощью различных библиотек с открытым исходным кодом.
Весь код, относящийся к этой статье, можно найтиover on Github.
ИТ-записки Чорнага кашака
При формировании строки для строкового значения JSON возникает необходимость контролировать некоторые символы. Например, если в содержимом строки есть двойная кавычка, то для получения строки JSON недостаточно взять исходную строку в двойные кавычки. Это двойную кавычку необходимо «экранировать» — поставить перед ней символ обратной косой черты («\»). Кроме двойной кавычки обязательно необходимо экранировать саму обратную косую черту, а также все управляющие символы от U+0000 до U+001F (т.е. символы от 0 до 31).
Рассмотрим подробнее, как экранируются символы. Любой символ от U+0000 до U+FFFF (не только управляющий) в строке JSON может быть представлен в виде последовательности из шести символов: обратный косая черта, строчная буква u, код символа в виде четырех шестнадцатеричные цифр. Буквы в шестнадцатеричные цифрах не зависят от регистра и могут быть как прописными, так и строчными. Например, буква «ё» представляется как «\u0451», а буква «к» как «\u043A».
Среди управляющих символов выделены «специальные символы», которые в строке JSON представлены в виде комбинации обратной косой черты и символа:
Специальный символ | Представление в строке JSON | ||
Кавычки (quotation mark) | « | U+0022 | \» |
Обратная косая черта (reverse solidus) | \ | U+005C | \\ |
Косая черта (solidus) | / | U+002F | \/ |
Backspace | U+000C | \b | |
Подача страницы (form feed) | U+000C | \f | |
Перевод строки (line feed) | U+000A | \n | |
Возврат каретки (carriage return) | U+000D | \r | |
Табуляция (tab) | U+0009 | \t |
Теперь от теории перейдем к практике. Можно самому написать парсер строки, который экранирует управляющие символы по описанным выше правилам, а можно воспользоваться готовым классом TJSONString из модуля System.JSON:
function ToJsonString(const st: String): String; var js: TJSONString; begin js := TJSONString.Create(st); try Result := js.ToString; finally js.Free; end; end;
Путь к нашему файлу: "c:\temp\от 1 до 2"
"Путь к нашему файлу:\t\"c:\\temp\\от 1 до 2\""
Кроме читаемого человеком формата, из TJSONString можно получить JSON-строку в формате UTF8 в которой экранированы не только управляющие символы, но все символы начиная с +U0080, т.е. с 128-го символа (например, кириллические символы):
function ToJsonString(const st: String): String; var js: TJSONString; begin js := TJSONString.Create(st); try Result := js.ToJSON; finally js.Free; end; end;
Путь к нашему файлу: "c:\temp\от 1 до 2"
"\u041F\u0443\u0442\u044C \u043A \u043D\u0430\u0448\u0435 \u043C\u0443 \u0444\u0430\u0439\u043B\u0443:\t\"c:\\temp\\ \u043E\u0442 1 \u0434\u043E 2\""
Но его замечательно понимают парсеры JSON.