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

Ответ 1

Строка 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


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

Это bad, потому что:

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

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

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

Ответ 2

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

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

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

Image showing the definition of a string from the JSON spec

Симпатичная фотография также перечисляет все законные escape-последовательности в строке JSON:

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

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

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

Ответ 3

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

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

Ответ 4

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

ОК, поэтому 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

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

Ответ 5

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

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

Ответ 6

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

<script>
  var MY_APP = { data: JSON.parse('<%-JSON.stringify(data)%>'};
</script>

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

<script>var BRANCHE = { data: JSON.parse('<%-
  JSON.stringify(data).replace("'","\\\'")%>')};
</script>

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

Ответ 7

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

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

ПОЛЕЗНАЯ СПРАВКА: http://es5.github.io/x7.html#x7.8.4

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

Ответ 8

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

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

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

Ответ 10

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

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

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

Ответ 11

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

 \'  Apostrophe or single quote
 \"  Double quote

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

Пример:

'Bart\ car'       -> valid
'Bart says \"Hi\"'  -> invalid