Экранировать строку JSON в Java
В этом кратком руководстве мы покажем несколько способов экранирования строки JSON в Java.
Мы совершим краткий обзор самых популярных библиотек для обработки JSON и того, как с их помощью избежать простой задачи.
2. Что может пойти не так?
Давайте рассмотрим простой, но распространенный случай отправки указанного пользователем сообщения в веб-службу. Наивно, мы могли бы попробовать:
String payload = " + message + "\">"; sendMessage(payload);
Но, на самом деле, это может создать много проблем.
Самое простое, если сообщение содержит цитату:
"message" : "My "message" breaks json" >
Хуже того, пользователь может намеренно нарушить семантику запроса . Если он посылает:
Hello", "role" : "admin
Тогда сообщение становится:
"message" : "Hello", "role" : "admin" >
Самый простой подход — заменить кавычки соответствующей escape-последовательностью:
String payload = " + message.replace("\"", "\\\"") + "\">";
Однако этот подход довольно хрупок:
- Это необходимо сделать для каждого конкатенированного значения , и нам нужно всегда помнить, какие строки мы уже экранировали.
- Более того, поскольку структура сообщения со временем меняется, это может стать головной болью при обслуживании.
- И это трудно читать, что делает его еще более подверженным ошибкам .
Проще говоря, нам нужно использовать более общий подход. К сожалению, нативные функции обработки 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();
Это возьмет кавычки вокруг «World» и избежит их:
"message" : "Hello \"World\"" >
4. Библиотека Джексона
Одна из самых популярных и универсальных библиотек Java для обработки JSON — Jackson .
На первый взгляд Джексон ведет себя аналогично org.json :
MapString, Object> 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\""));
В обоих случаях мы получаем тот же результат, что и раньше:
"message" : "Hello \"World\"" >
В тех случаях, когда у нас есть уже экранированное свойство и нам нужно сериализовать его без дальнейшего экранирования, мы можем захотеть использовать аннотацию Джексона @JsonRawValue для этого поля.
5. Библиотека Гсона
Gson — это библиотека от Google, которая часто конкурирует с Jackson .
Мы можем, конечно, снова сделать то, что мы сделали с 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 .
- 1. Обзор
- 2. Что может пойти не так?
- 3. Библиотека JSON-java
- 4. Библиотека Джексона
- 5. Библиотека Гсона
- 6. Заключение
Как экранировать кавычки js
Чтобы экранировать кавычки, в JS существует несколько спосбов.
Вы можете обернуть строку в другой вид кавычек. Например если вы хотите вывести одинарную кавычку ‘ , то строку можно обернуть в двойные кавычки:
Текст без кавычек, 'текст в кавычках'
И наоборот, если вы хотите вывести двойные кавычки, то их можно обернуть в одинарные:
Текст без кавычек, "текст в кавычках"
Другой способ — это использовать символ обратной косой черты(обратный слэш) \ перед кавычками:
Текст без кавычек, 'текст в кавычках' // тоже самое с двойными кавычками: const result2 = "Текст без кавычек, \"текст в кавычках\""; console.log(result2); // => Текст без кавычек, "текст в кавычках"
ИТ-записки Чорнага кашака
При формировании строки для строкового значения 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.
Парсинг JSON в котором встречаются «кавычки в кавычках»
Пробовал использовать функцию json.dumps , и потом передавать объект в json.loads , но почему то возвращается не словарь, а строка.
import json str_json = "" dmp = json.dumps( str_json ) jstr = json.loads(dmp) print(jstr['id'])
TypeError: string indices must be integers
Подскажите пожалуйста как быстро и без «костелей» разобрать «такой» JSON?
Вот похожий вопрос, но на него никто не ответил(
Отслеживать
3,711 6 6 золотых знаков 13 13 серебряных знаков 32 32 бронзовых знака
задан 14 авг 2018 в 14:25
garrythehotdog garrythehotdog
1,032 2 2 золотых знака 7 7 серебряных знаков 20 20 бронзовых знаков
Это не JSON. За неимением другого, цитирую вики: Строка — это упорядоченное множество из нуля или более символов юникода, заключённое в двойные кавычки.
14 авг 2018 в 14:29
Без костылей никак. Первое, что приходит в голову — считать файл как обычный текст, заменить в нём все вхождения одинарных кавычек на двойные и уже получившуюся строку обработать средствами модуля json. Но более правильный образ действий — применить физическое насилие к автору исходных данных.
14 авг 2018 в 14:32
json.dumps() не превращает ваш невалидный json в валидный, он её просто экранирует так, чтобы она стала валидным json’ом из одной строки содержащей невалидный json. А json.loads() из получившегося json эту строку извлекает. Я вам сразу написал, либо обрабатывайте сырой текст, либо требуйте от источника данных валидности.
14 авг 2018 в 16:22
1. ТС, а что если заменить одиночную кавычку ‘ на двойную и скормить? 2. Посмотрите hjson, там вкладка Try. Пример hjson обработал