Как экранировать кавычки в json
Перейти к содержимому

Как экранировать кавычки в json

  • автор:

Экранировать строку 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 обработал

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *