Экранировать кавычки json java

экранирование кавычек в 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.

Источник

Читайте также:  Передать параметры формы php
Оцените статью