Как избежать специальных символов при построении строки JSON?

Вот моя строка

{ 'user': { 'name': 'abc', 'fx': { 'message': { 'color': 'red' }, 'user': { 'color': 'blue' } } }, 'timestamp': '2013-10-04T08: 10: 41+0100', 'message': 'I'mABC..', 'nanotime': '19993363098581330' } 

Здесь сообщение содержит одинарный кавычек, который совпадает с котировкой, используемой в JSON. То, что я делаю, заполняет строку из пользовательских входов, таких как сообщение. Поэтому мне нужно избегать тех специальных сценариев, которые нарушают код. Но кроме замены строки, есть ли способ убедить их избежать, но все же позволить HTML обрабатывать их обратно к правильному сообщению?

Строка JSON должна быть двойным, в соответствии со спецификациями , поэтому вам не нужно бежать ' .
Если вы должны использовать специальный символ в своей строке JSON, вы можете избежать его с помощью символа \ .

См. Этот список специальных символов, используемых в JSON:

 \b Backspace (ascii code 08) \f Form feed (ascii code 0C) \n New line \r Carriage return \t Tab \" Double quote \\ Backslash character 

Однако, даже если это полностью противоречит спецификации, автор может использовать.

Это плохо, потому что:

  • Это противоречит спецификациям
  • Это не более чем допустимая строка JSON

Но он работает, как вы этого хотите или нет.

Для новых читателей всегда используйте двойные кавычки для ваших строк json.

Я потрясен присутствием крайне преувеличенной дезинформации по столь широко обсуждаемому вопросу об основной теме.

Строки JSON не могут быть указаны с одинарными кавычками . Различные версии спецификации ( оригинал Дугласа Крокфорда, версия ECMA и версия IETF ) указывают, что строки должны быть указаны с двойными кавычками. Это не теоретический вопрос, не вопрос мнения, который в настоящее время предлагает принятый ответ; любой анализатор JSON в реальном мире будет выходить из строя, если вы попытаетесь проанализировать строку с одним кавычком.

Версия Crockford и ECMA даже отображают определение строки, используя симпатичную картинку, которая должна сделать точку однозначно понятной:

Изображение, показывающее определение строки из спецификации JSON

В симпатичной картине также перечислены все законные escape-последовательности в строке JSON:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u за которым следуют четыре шестнадцатеричных цифры

Обратите внимание, что вопреки бессмыслице в некоторых других ответах здесь \' никогда не является допустимой escape-последовательностью в строке JSON. Этого не должно быть, потому что строки JSON всегда двойные.

Наконец, обычно вам не нужно думать об экранировании персонажей при программном создании JSON (хотя, конечно, вы будете вручную редактировать, скажем, файл конфигурации на основе JSON). Вместо этого формируйте структуру данных, которую вы хотите кодировать, используя любые родные карты, массивы, строки, числа, логические и нулевые типы, которые имеет ваш язык, и затем кодируйте их в JSON с помощью функции JSON-encoding. Такая функция, вероятно, встроена в любой язык, который вы используете, например JSON.stringify JavaScript, json_encode PHP или json.dumps Python. Если вы используете язык, на котором нет такой функциональности, вы можете найти библиотеку JSON для parsingа и кодирования. Если вы просто используете функции языка или библиотеки, чтобы конвертировать объекты в JSON и из них, вам даже не нужно знать правила экранирования JSON. Это то, что должен был сделать ошибочный вопрос.

Все говорят о том, как сбежать из ' -конированного строкового литерала». Здесь гораздо большая проблема: однострочные строковые литералы недействительны JSON . JSON основан на JavaScript, но это не одно и то же. Если вы пишете объектный литерал внутри кода JavaScript, отлично; если вам действительно нужен JSON, вам нужно использовать " .

С помощью строк с двойными кавычками вам не нужно будет выходить из ' . (И если вам нужна буквальная строка в строке, вы должны использовать ее.)

Большинство этих ответов либо не отвечают на вопрос, либо излишне долго объясняются.

ОК, поэтому JSON использует только двойные кавычки, мы получаем это!

Я пытался использовать JQuery AJAX для отправки данных JSON на сервер, а затем позже возвращал эту же информацию. Лучшее решение поставленного вопроса, которое я нашел, это использовать:

 var d = { name: 'whatever', address: 'whatever', DOB: '01/01/2001' } $.ajax({ type: "POST", url: 'some/url', dataType: 'json', data: JSON.stringify(d), ... } 

Это позволит избежать символов для вас.

Это также предложил Марк Эмери, отличный ответ BTW

Надеюсь, это поможет кому-то.

Может быть, я слишком поздно для вечеринки, но это будет синтаксический анализ / исключение одиночной цитаты (не хотите вступать в битву при parsingе и побеге).

 JSON.parse("\"'\"") 

Ответ на прямой вопрос:
Чтобы быть в безопасности, замените требуемый символ на \ u + 4-digit-hex-value

Пример: Если вы хотите избежать апострофа, замените его на \ u0027
D’Amico становится D \ u0027Amico

NICE REFERENCE: http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes

Я думаю, мы все согласны, что одиночные кавычки jsons не являются реальными jsons. Как бы то ни было, нам все равно нужно решить вопрос об экранировании «внутри строки с двойным кавычками json, в отсутствие библиотек для этого.

Замена каждого «на a» НЕ ДОСТАТОЧНО: пользователь может ввести ввод: \ и parsing, опять же, сбой (подумайте, почему).

Вместо этого сначала замените каждый \ на \ (двойной обратный слэш). Только тогда замените каждый «на» (обратная косая черта с последующим символом «)».

Это проблема, если вы включаете свои данные в html-файл следующим образом (используя механизм шаблонов ejs):

  

если данные содержат строку с одинарными кавычками, это приведет к ошибке, если вы не конвертируете ' в \' что возможно только в строке "\\\'"

  

Не красиво, но работает.

относительно сообщения AlexB:

  \' Apostrophe or single quote \" Double quote 

escape-одиночные кавычки действительны только в одиночных кавычках json
экранирование двойных кавычек допустимо только в двойных кавычках json

пример:

 'Bart\'s car' -> valid 'Bart says \"Hi\"' -> invalid 
  • Двоичные данные в строке JSON. Что-то лучше, чем Base64
  • Разбор JSON из URL
  • DataContractJsonSerializer - десериализация DateTime в списке
  • Анализ JSON из данных успеха JQuery.ajax
  • выводить массив JSON в таблице html (страница jsp)
  • LINQ to Entities не распознает метод 'System.Web.Mvc.FileResult'
  • Только использование @JsonIgnore во время сериализации, но не десериализация
  • Как разобрать JSON и превратить его значения в массив?
  • Android-создать JSON-массив и объект JSON
  • Swift 4 Decodable с ключами, не известными до времени декодирования
  • Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  • Interesting Posts

    Использование VirtualPathProvider для загрузки представлений ASP.NET MVC из DLL

    Каков наилучший способ обрезать std :: string?

    Как я могу ограничить GenericForeignKey Django списком моделей?

    Как сделать взаимодействие между виртуальными машинами в VirtualBox?

    Отображение MapView с отсутствующими fragmentами с «x» в центре

    Возможно ли связать мою Magic Mouse с Windows и Mac OS X?

    Какой спецификатор доступа по умолчанию в Java?

    Как вернуть данные JSON из весеннего controllerа с помощью @ResponseBody

    Порт USB 3.0 не работает с Windows 10

    C # оптимизирует конкатенацию строковых литералов?

    Принудительные программы, которые не определяют параметры прокси-сервера для использования прокси-сервера (например: Steam)

    Почему вызов dispose () на объекте Graphics заставляет JPanel не отображать какие-либо компоненты

    Просмотр попыток паролей, используемых для входа в систему

    jQueryUI droppable, прекращение распространения для перекрытого родного брата

    Как предотвратить запрос jQuery Ajax от кеширования в Internet Explorer?

    Давайте будем гением компьютера.