Как я должен экранировать строки в JSON?
при создании данных JSON вручную, как я должен экранировать строковые поля? Я должен использовать что-то вроде Apache Commons Lang’s StringEscapeUtilities.escapeHtml , StringEscapeUtilities.escapeXml , или я должен использовать java.net.URLEncoder ?
проблема в том, что когда я использую SEU.escapeHtml , он не экранирует кавычки и когда я обертываю всю строку в пару ‘ s, будет сгенерирован искаженный JSON.
18 ответов:
в идеале, найти библиотеку JSON на вашем языке что вы можете кормить некоторые соответствующие структуры данных,и пусть он беспокоится о том, как избежать вещей. Это поможет тебе сохранить рассудок. Если по какой-либо причине у вас нет библиотеки на вашем языке, вы не хотите ее использовать (я бы не предложил это1), или вы пишете библиотеку JSON, читайте дальше.
избежать его в соответствии с RFC. JSON довольно либеральный: только символы вы должны побег — это \ , » , и управляющие коды (что-нибудь меньшее, чем U+0020).
эта структура экранирования специфична для JSON. Вам понадобится специальная функция JSON. Все побеги могут быть записаны как \uXXXX здесь XXXX является UTF-16 код unit1 для этого символа. Есть несколько ярлыков, таких как \ , которые также работают. (И они приводят к меньшему и более четкому выходу.)
для получения более подробной информации см. RFC.
1JSON по escaping построен на JS, поэтому он использует \uXXXX , где XXXX блок кода UTF-16. Для кодовых точек за пределами BMP это означает кодирование суррогатных пар, которые могут стать немного волосатыми. (Или вы можете просто вывести символ напрямую, так как кодировка JSON для текста Unicode и позволяет эти конкретные символы.)
org.формат JSON.простой.JSONObject.escape () экранирует кавычки,\,/, \r, \n, \b, \f, \t и другие управляющие символы. Он может быть использован для экранирования кодов JavaScript.
Apache commons lang теперь поддерживает это. Просто убедитесь, что у вас есть достаточно недавняя версия Apache commons lang на вашем пути к классам. Вам понадобится версия 3.2+
примечания к выпуску для версии 3.2
LANG-797: добавлен escape / unescapeJson в StringEscapeUtils.
org.json.JSONObject quote(String data) метод делает работу
выдержка из документации:
кодирует данные в виде строки JSON. это относится кавычки и любой необходимый символ экранирования. [. ] Null будет интерпретироваться как пустая строка
StringEscapeUtils.escapeJavaScript / StringEscapeUtils.escapeEcmaScript должны сделать трюк.
Не уверен, что вы подразумеваете под «созданием json вручную», но вы можете использовать что-то вроде gson (http://code.google.com/p/google-gson/), и это преобразует ваш HashMap, массив, строку и т. д. В значение JSON. Я рекомендую пойти с рамками для этого.
Если вы используете fastexml jackson, вы можете использовать следующее: com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Если вы используете codehaus jackson, вы можете использовать следующее: org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
Я не потратил время, чтобы убедиться на 100%, но он работал для моих входов достаточно, чтобы быть принятым онлайн-валидаторами JSON:
хотя это выглядит не лучше, чем org.codehaus.jettison.json.JSONObject.quote(«your string»)
Я просто использую инструменты скорости в своем проекте уже — мое» ручное JSON » здание было в шаблоне скорости
для тех, кто пришел сюда в поисках решения командной строки, как и я, curl’s —data-urlencode отлично работает:
передает
, например. Большие данные JSON могут быть помещены в файл, и вы будете использовать синтаксис@, чтобы указать файл для slurp в подлежащих экранированию данных. Например, если
вы могли бы использовать
и теперь, это также учебник о том, как запросить Freebase из командной строки : -)
Экранирование и разэкранирование JSON
Считаете ли вы этот инструмент полезным? То поделитесь этим с друзьями или коллегами. Это поможет нам сделать наши бесплатные веб-инструменты лучше.
Введите здесь JSON что бы Экранировать/Разэкранировать:
Об онлайн JSON экранировании/разэкранировании
Об JSON экранировании/разэкранировании
Экранирует или разэкранировает строку JSON, удаляя следы экранируемых символов, которые могут помешать интерпретации.
JSON Экраировать / JSON Разэкранировать — это онлайн инструмент, созданный для помощи в экранировании специальных символов Юникода в строковое литеральное значение в кавычках для объекта JSON, а также для разэкранирования его.
Какие символы заменены?
Следующие символы зарезервированы в JSON и должны быть правильно экранированы для использования в строках:
- Горизонтальная таб заменяется на \t
- Вертикальная таб заменяется на \v
- Нуль символ заменяется на \0
- Возврат на одну позицию заменяется на \b
- Форма feed заменяется на \f
- Новая линия заменяется на \n
- Возврат каретки заменяется на \r
- Двойная кавычка заменяется на \»
- Бэкслэш заменяется на \\
Как это работает?
Просто вставьте свой код JSON в текстовое поле выше и нажмите кнопку «Экранировать» или «Разэкранировать», и вы получите ваши экранированные/разэкранированне данные.
Пример JSON Экранирования
Вам понравился этот инструмент? Вы можете задонатить нам. Это поможет нам улучшить наши бесплатные веб-инструменты.
Работа с JSON
Обозначение объектов JavaScript (JSON — JavaScript Object Notation) — стандартный текстовый формат для представления структурированных данных на основе синтаксиса объекта JavaScript. Он обычно используется для передачи данных в веб-приложениях (например, отправка некоторых данных с сервера клиенту,таким образом чтобы это могло отображаться на веб-странице или наоборот). Вы будете сталкиваться с этим довольно часто, поэтому в этой статье мы даём вам все, что вам нужно для работы с JSON используя JavaScript, включая парсинг JSON, чтобы вы могли получить доступ к данным внутри него при создании JSON.
| Необходимые знания: | Базовая компьютерная грамотность, базовые знания HTML и CSS, знакомство с основами JavaScript (см. First steps и Building blocks) и основами OOJS (see Introduction to objects (en-US) ). |
|---|---|
| Цель: | Понять, как работать с данными, хранящимися в JSON, и создавать свои собственные объекты JSON. |
Нет, действительно, что такое JSON?
JSON — текстовый формат данных, следующий за синтаксисом объекта JavaScript, который был популяризирован Дугласом Крокфордом. Несмотря на то, что он очень похож на буквенный синтаксис объекта JavaScript, его можно использовать независимо от JavaScript, и многие среды программирования имеют возможность читать (анализировать) и генерировать JSON.
JSON существует как строка,что необходимо при передаче данных по сети. Он должен быть преобразован в собственный объект JavaScript, если вы хотите получить доступ к данным. Это не большая проблема. JavaScript предоставляет глобальный объект JSON, который имеет методы для преобразования между ними.
Примечание: Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную*)*, в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму).
Объект JSON может быть сохранён в собственном файле, который в основном представляет собой текстовый файл с расширением .json и MIME type application/json .
Структура JSON
Как описано выше, JSON представляет собой строку, формат которой очень похож на буквенный формат объекта JavaScript. Вы можете включать одни и те же базовые типы данных внутри JSON, так же как и в стандартном объекте JavaScript — строки, числа, массивы, булевы и другие объектные литералы. Это позволяет построить иерархию данных, к примеру, так:
Если бы мы загрузили этот объект в программу JavaScript, создали переменную с названием superHeroes , мы могли бы затем получить доступ к данным внутри неё, используя те же самые точечную и скобочную нотации, которые мы рассмотрели в статье JavaScript object basics. Например:
Чтобы получить доступ к последующим данным по иерархии, вам просто нужно объединить требуемые имена свойств и индексы массивов. Например, чтобы получить доступ к третьей сверхспособности второго героя, указанного в списке участников, вы должны сделать следующее:
- Сначала у нас есть имя переменной — superHeroes .
- Внутри мы хотим получить доступ к свойству members , поэтому мы используем [‘members’] .
- members содержат массив, заполненный объектами. Мы хотим получить доступ ко второму объекту внутри массива, поэтому мы используем [1] .
- Внутри этого объекта мы хотим получить доступ к свойству powers , поэтому мы используем [‘powers’] .
- Внутри свойства powers находится массив, содержащий сверхспособности выбранного героя. Нам нужен третий, поэтому мы используем [2] .
Примечание: . Мы сделали JSON, видимый выше, доступным внутри переменной в нашем примере JSONTest.html (см. исходный код). Попробуйте загрузить это, а затем получить доступ к данным внутри переменной через консоль JavaScript вашего браузера.
Массивы как JSON
Выше мы упоминали ,что JSON текст выглядит практически так же как и JavaScript объект,и это почти правильно.Причина,по которой мы говорим почти правильно заключается в том ,что массив также валиден JSON например:
Вышесказанное вполне справедливо для JSON. Вам просто нужно получить доступ к элементам массива (в его анализируемой версии), начиная с индекса массива, например [0][«powers»][0] .
Другие примечания
- JSON — это чисто формат данных — он содержит только свойства, без методов.
- JSON требует двойных кавычек, которые будут использоваться вокруг строк и имён свойств. Одиночные кавычки недействительны.
- Даже одна неуместная запятая или двоеточие могут привести к сбою JSON-файла и не работать. Вы должны быть осторожны, чтобы проверить любые данные, которые вы пытаетесь использовать (хотя сгенерированный компьютером JSON с меньшей вероятностью включает ошибки, если программа генератора работает правильно). Вы можете проверить JSON с помощью приложения вроде JSONLint.
- JSON может принимать форму любого типа данных, допустимого для включения в JSON, а не только массивов или объектов. Так, например, одна строка или номер будут действительным объектом JSON.
- В отличие от кода JavaScript, в котором свойства объекта могут не заключаться в двойные кавычки, в JSON в качестве свойств могут использоваться только строки заключённые в двойные кавычки.
Активное обучение: Работа с примером JSON
Итак, давайте рассмотрим пример, чтобы показать то, как мы можем использовать некоторые данные JSON на веб-сайте.
Начало работы
Для начала создайте локальные копии наших файлов heroes.html и style.css. Последний содержит простой CSS для стилизации нашей страницы, в то время как первый содержит очень простой HTML-код сущности:
Плюс <script> , чтобы содержать код JavaScript, который мы будем писать в этом упражнении. На данный момент он содержит только две строки, которые захватывают ссылки на элементы <header> и <section> и сохраняют их в переменных:
Мы собираемся загрузить его на нашу страницу и использовать некоторые изящные манипуляции DOM, чтобы отобразить их, например:
Получение JSON
Чтобы получить JSON, мы будем использовать API, называемый XMLHttpRequest (часто называемый XHR). Это очень полезный объект JavaScript, который позволяет нам делать сетевые запросы для извлечения ресурсов с сервера через JavaScript (например, изображения, текст, JSON, даже фрагменты HTML), что означает, что мы можем обновлять небольшие разделы контента без необходимости перезагрузки всей страницы. Это привело к более отзывчивым веб-страницам и звучит захватывающе, но, к сожалению, выходит за рамки этой статьи, чтобы изучить это гораздо более подробно.
-
Начнём с того, что мы собираемся сохранить URL-адрес JSON, который мы хотим получить в переменной. Добавьте нижеследующий код JavaScript:
- Метод HTTP, который следует использовать при выполнении сетевого запроса. В этом случае GET самый подходящий, так как мы просто извлекаем некоторые простые данные.
- URL-адрес для запроса — это URL-адрес файла JSON, который мы сохранили ранее.
Здесь мы сохраняем ответ на наш запрос (доступный в свойстве response ) в переменной superHeroes ; эта переменная теперь будет содержать объект JavaScript, основанный на JSON! Затем мы передаём этот объект двум вызовам функций — первый из них заполнит <header> правильными данными, а второй создаст информационную карту для каждого героя в команде и вставляет её в <section> .
Мы свернули код в обработчик событий, который запускается, когда событие загрузки запускается в объекте запроса (см. onload ) — это связано с тем, что событие загрузки запускается, когда ответ успешно возвращается; поступая таким образом,это гарантия того, что request.response определённо будет доступен, когда мы начнём работу с ним.
Теперь мы извлекли данные JSON и превратили его в объект JavaScript, давайте воспользуемся им, написав две функции, на которые мы ссылались выше. Прежде всего, добавьте следующее определение функции ниже предыдущего кода:
Мы назвали параметр jsonObj , чтобы напомнить себе, что этот объект JavaScript возник из JSON. Здесь мы сначала создаём элемент <h1> (en-US) с createElement() , устанавливаем его textContent равным свойству squadName объекта, а затем добавляем его в заголовок с помощью appendChild() . Затем мы выполняем очень похожую операцию с абзацем: создаём его, устанавливаем его текстовое содержимое и добавляем его в заголовок. Единственное различие заключается в том, что его текст задан, как конкатенированная строка, содержащая как homeTown , так и formed свойства объекта.
Создание информационных карт героя
Затем добавьте следующую функцию внизу кода, которая создаёт и отображает карты супергероев:
Для начала сохраним свойство members объекта JavaScript в новой переменной. Этот массив содержит несколько объектов, которые содержат информацию для каждого героя.
Затем мы используем for loop для циклического прохождения каждого объекта в массиве. Для каждого из них мы:
- Создаём несколько новых элементов: <article> , <h2> , три <p> и <ul> .
- Устанавливаем <h2> , чтобы содержать name текущего героя.
- Заполняем три абзаца своей secretIdentity , age и строкой, в которой говорится: «Суперспособности:», чтобы ввести информацию в список.
- Сохраняем свойство powers в другой новой переменной под названием superPowers — где содержится массив, в котором перечислены сверхспособности текущего героя.
- Используем другой цикл for , чтобы прокрутить сверхспособности текущего героя , для каждого из них мы создаём элемент <li> , помещаем в него сверхспособности, а затем помещаем listItem внутри элемента <ul> ( myList ) с помощью appendChild() .
- Последнее, что мы делаем, это добавляем <h2> , <p> и <ul> внутри <article> ( myArticle ), а затем добавляем <article> в <section> . Важное значение имеет порядок, в котором добавляются элементы, так как это порядок, который они будут отображать внутри HTML.
Примечание: . Если вам не удаётся заставить этот пример работать, попробуйте обратиться к нашему исходному коду heroes-finished.html (см. также он работает в режиме live).
Примечание: . Если у вас возникли проблемы после нотации точек / скобок, которые мы используем для доступа к объекту JavaScript, в этом поможет открытие файла superheroes.json на другой вкладке или в текстовом редакторе ,и обращаться к нему каждый раз, когда вам нужен JavaScript. Вы также можете обратиться к нашей статье JavaScript objectbasics чтобы получить дополнительную информацию о нотации точек и скобок.
Преобразование между объектами и текстом
Вышеприведённый пример был прост с точки зрения доступа к объекту JavaScript, потому что мы задали XHR-запрос для прямого преобразования ответа JSON в объект JavaScript, используя:
Но иногда нам не так везёт — иногда мы получаем сырую строку JSON и нам нужно преобразовать её в объект самостоятельно. И когда мы хотим отправить объект JavaScript по сети, нам нужно преобразовать его в JSON (строку) перед отправкой. К счастью, эти две проблемы настолько распространены в веб-разработке, что встроенный объект JSON доступен в браузерах, которые содержат следующие два метода:
-
: принимает строку JSON в качестве параметра и возвращает соответствующий объект JavaScript. : принимает объект, как параметр и возвращает эквивалентную строковую JSON строку.
Вы можете увидеть первый метод в действии в нашем примере heroes-finished-json-parse.html (см. исходный код) — это то же самое, что и в примере, который мы создали ранее, за исключением того, что мы установили XHR для возврата сырого JSON текста, затем используется parse() , чтобы преобразовать его в фактический объект JavaScript. Ключевой фрагмент кода находится здесь:
Как вы могли догадаться, stringify() работает обратным образом. Попробуйте ввести следующие строки в консоль JavaScript браузера один за другим, чтобы увидеть его в действии:
Здесь мы создаём объект JavaScript, затем проверяем, что он содержит, а затем преобразуем его в строку JSON, используя stringify() , сохраняя возвращаемое значение в новой переменной, а затем снова проверяем его.
Резюме
В этой статье мы предоставили вам простое руководство по использованию JSON в ваших программах, в том числе о том, как создавать и анализировать JSON, и как получить доступ к данным, заблокированным внутри него. В следующей статье мы рассмотрим объектно-ориентированный JavaScript.
ИТ-записки Чорнага кашака
При формировании строки для строкового значения JSON возникает необходимость контролировать некоторые символы. Например, если в содержимом строки есть двойная кавычка, то для получения строки JSON недостаточно взять исходную строку в двойные кавычки. Это двойную кавычку необходимо «экранировать» — поставить перед ней символ обратной косой черты («\»). Кроме двойной кавычки обязательно необходимо экранировать саму обратную косую черту, а также все управляющие символы от U+0000 до U+001F (т.е. символы от 0 до 31).
Рассмотрим подробнее, как экранируются символы. Любой символ от U+0000 до U+FFFF (не только управляющий) в строке JSON может быть представлен в виде последовательности из шести символов: обратный косая черта, строчная буква u, код символа в виде четырех шестнадцатеричные цифр. Буквы в шестнадцатеричные цифрах не зависят от регистра и могут быть как прописными, так и строчными. Например, буква «ё» представляется как «\u0451», а буква «к» как «\u043A».
Среди управляющих символов выделены «специальные символы», которые в строке JSON представлены в виде комбинации обратной косой черты и символа: