Как вручную создавать строковые поля при создании данных JSON? Должен ли я использовать что - то вроде Apache Commons Ланг StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
или я должен использовать java.net.URLEncoder
?
Проблема в том, что когда я использую SEU.escapeHtml
, он не экранирует кавычки, а когда я заключаю всю строку в пару '
s, генерируется искаженный JSON.
'
, вы обречены с самого начала: строки JSON могут быть только окружены"
. См. Ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
схему. Это довольно полезно.Ответы:
В идеале, найдите на своем языке библиотеку JSON, в которую вы можете передать некоторую подходящую структуру данных, и пусть она беспокоится о том, как избежать чего-либо . Это будет держать вас намного разумнее. Если по какой-либо причине у вас нет библиотеки на вашем языке, вы не хотите использовать ее (я бы не советовал это делать), или вы пишете библиотеку JSON, продолжайте читать.
Побег это в соответствии с RFC. JSON довольно либерален: только символы вы должны вырваться из кабалы
\
,"
и управляющие коды (все , что меньше , чем U + 0020).Эта структура экранирования специфична для JSON. Вам понадобится особая функция JSON. Все escape-коды могут быть записаны как
\uXXXX
гдеXXXX
находится кодовая единица UTF-16 для этого символа. Есть несколько сочетаний клавиш, например\\
, которые также работают. (И они приводят к меньшему и более четкому выводу.)Для получения полной информации см. RFC .
Экранирование ¹JSON построено на JS, поэтому он использует
\uXXXX
, гдеXXXX
это код блок UTF-16. Для кодовых точек вне BMP это означает кодирование суррогатных пар, что может быть немного затруднительно. (Или вы можете просто вывести символ напрямую, так как кодированный для JSON символ Unicode позволяет использовать эти символы.)источник
"
).{[]}:?
не должны быть экранированы одной обратной косой чертой. (\:
Например, недопустимо в строке JSON.) Все из них могут быть необязательно экранированы с использованием\uXXXX
синтаксиса, тратя несколько байтов. См. §2.5 RFC.JSON.stringify()
сделал работу.Выписка из Джеттисон :
источник
"
,\
и управляющие символы (те, что перед «») действительны в строках JSON, если совпадает выходная кодировка. Другими словами, вам не нужно кодировать «펍»,\uD38D
если сохраняется кодировка UTF.Попробуй это
org.codehaus.jettison.json.JSONObject.quote("your string")
.Загрузите его здесь: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
источник
org.json.simple.JSONObject.escape () экранирует кавычки, \, /, \ r, \ n, \ b, \ f, \ t и другие управляющие символы. Может использоваться для экранирования JavaScript-кодов.
источник
Apache Commons Lang теперь поддерживает это. Просто убедитесь, что у вас есть достаточно свежая версия Apache Commons Lang на вашем пути к классам. Вам понадобится версия 3.2+
Примечания к выпуску для версии 3.2
LANG-797: добавлен escape / unescapeJson в StringEscapeUtils.
источник
/
символы. Это ломает много вещей, включая JSON с URL-адресами. Первоначальное предложение содержало/
специальный символ, который нужно было убежать, но это уже не тот случай, как мы видим в последней спецификации на момент написанияorg.json.JSONObject
quote(String data)
метод делает работуВыписка из документации:
источник
org.apache.sling.commons.json.JSONObject
тоже есть то же самоеStringEscapeUtils.escapeJavaScript
/StringEscapeUtils.escapeEcmaScript
тоже надо делать свое дело.источник
escapeJavaScript
экранирует одинарные кавычки как\'
, что неверно.Если вы используете fastexml jackson, вы можете использовать следующее:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Если вы используете Codehaus Jackson, вы можете использовать следующее:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
источник
Не уверен, что вы подразумеваете под «созданием json вручную», но вы можете использовать что-то вроде gson ( http://code.google.com/p/google-gson/ ), и это изменит ваш HashMap, Array, String и т. Д. , в значение JSON. Я рекомендую пойти с рамкой для этого.
источник
Я не потратил время на 100% уверенность, но он сработал для моих входов достаточно, чтобы быть принятыми онлайн-валидаторами JSON:
хотя выглядит не лучше
org.codehaus.jettison.json.JSONObject.quote("your string")
Я просто уже использую инструменты скорости в своем проекте - мое «ручное JSON» здание было в шаблоне скорости
источник
Для тех, кто пришел сюда в поисках решения для командной строки, как я, cURL's --data-urlencode работает отлично:
посылает
, например. Большие JSON-данные могут быть помещены в файл, и вы будете использовать синтаксис @, чтобы указать файл, из которого следует выходить из данных, которые должны быть экранированы. Например, если
вы бы использовали
И теперь, это также учебник о том, как запросить Freebase из командной строки :-)
источник
Используйте класс EscapeUtils в API общего языка.
источник
Рассмотрим Moshi «s JsonWriter класс. Он имеет прекрасный API и сводит к минимуму копирование, все может быть красиво передано в файл, OutputStream и т. Д.
Если вы хотите строку в руке:
источник
У Apache commons-text теперь есть StringEscapeUtils.escapeJson (String) .
источник
Если вам нужно экранировать JSON внутри строки JSON, используйте org.json.JSONObject.quote («ваша строка json, которую нужно экранировать»), кажется, работает хорошо
источник
Использование синтаксиса \ uXXXX может решить эту проблему, Google UTF-16 с именем знака, вы можете узнать XXXX, например: utf-16 двойная кавычка
источник
Здесь методы, которые показывают фактическую реализацию, являются ошибочными.
У меня нет Java-кода, но только для записи, вы можете легко преобразовать этот C # -код:
Предоставлено монопроектом @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Это может быть сжато в
источник
quote()
метод, описанный в других ответах, ошибочен?Я думаю, что лучший ответ в 2017 году - использовать API javax.json. Используйте javax.json.JsonBuilderFactory для создания ваших объектов json, затем запишите объекты, используя javax.json.JsonWriterFactory. Очень хорошая комбинация строитель / писатель.
источник