Как избежать специальных символов при создании строки 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 обрабатывать их обратно к правильному сообщению?

Комментарии к вопросу (5)

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

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

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

Изображение, показывающее определение строки из спецификации JSON! На красивой картинке также перечислены все законные escape-последовательности в строке JSON:

  • \ "
  • \\
  • \ /
  • \ b
  • \ f
  • \ n
  • \ r
  • \ t
  • \ u, за которым следуют четыре гексогена

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

Наконец, вам обычно не нужно думать о том, чтобы экранировать символы самостоятельно при программном создании JSON (хотя, конечно, при ручном редактировании, скажем, файла конфигурации на основе JSON). Вместо этого сформируйте структуру данных, которую вы хотите кодировать, используя любые собственные типы карт, массивов, строк, чисел, логических и нулевых типов, которые есть у вашего языка, а затем закодируйте его в JSON с помощью функции кодирования JSON. Такая функция, вероятно, встроена в любой язык, который вы используете, например, JavaScript JSON.stringify, PHP [json_encode](http:/phpyfun. Если вы используете язык, который не имеет такой встроенной функции, вы, вероятно, можете найти библиотеку синтаксического анализа и кодирования JSON для использования. Если вы просто используете языковые или библиотечные функции для преобразования вещей в JSON и обратно, вам даже не нужно знать правила побега JSON. Это то, что должен был сделать ошибочный вопрос.

Комментарии (0)
Решение

Строка JSON должна быть дважды процитирована, согласно specs, поэтому вам не нужно избегать '. Если вам нужно использовать специальный символ в строке 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

< br / >

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

Это плохо потому что: & Лт; Ul >

< li > Это противоречит спецификации < / li > < li > Это недопустимая строка JSON < / li > & Лт; / UL > Но это работает, как вы хотите или нет.

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

Комментарии (18)

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

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

Комментарии (2)

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

Хорошо, 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

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

Комментарии (0)

Чтобы разрешить одинарные кавычки в цитируемой строке с двумя кавычками для json, вы удваиваете одинарную кавычку. {"X": "В чем вопрос"} == > {"X": "В чем вопрос"}

https://codereview.stackexchange.com/questions/69266/json-conversion-to-single-quotes

Последовательность \ 'неверна.

Комментарии (0)

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

JSON.parse("\"'\"")
Комментарии (0)

Используйте encodeURIComponent () для кодирования строки.

Например. var product_list = encodeURIComponent (JSON.stringify (product_list)) ;

Вам не нужно декодировать его, поскольку веб-сервер автоматически делает то же самое.

Комментарии (0)

Ответ на прямой вопрос: < br / > Чтобы быть в безопасности, замените необходимый символ на \ u + 4-значное значение hex

Пример: Если вы хотите избежать апострофа, замените на \ u0027 < br / > Д'Амико становится D \ u0027Amico

Хорошая ссылка: http://es5.github.io/x7.html#x7.8.4

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

Комментарии (2)

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

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

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

Комментарии (0)

относительно поста AlexB:

 \'  Apostrophe or single quote
 \"  Double quote

экранирование одинарных кавычек действует только в строках json с одинарными кавычками < br / > escaping двойные кавычки действительны только в двойных кавычках json

пример:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid
Комментарии (2)