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

915   9  

9 ответов:

строка 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 в реальном мире будет ошибаться, если вы попытаетесь проанализировать строку с одной кавычкой.

версия Крокфорда и 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). Вместо этого создайте структуру данных, которую вы хотите кодировать, используя любые собственные типы map, array, string, number, boolean и null, которые есть в вашем языке, а затем кодируйте ее в JSON с помощью функции кодирования JSON. Такая функция, вероятно, встроена какой бы язык вы ни использовали, например JavaScript JSON.stringify, в PHP json_encode, или в Python json.dumps. Если вы используете язык, который не имеет такой встроенной функциональности, вы, вероятно, можете найти библиотеку синтаксического анализа и кодирования JSON для использования. Если вы просто используете языковые или библиотечные функции для преобразования вещей в JSON и из JSON, вам даже не нужно знать правила экранирования JSON. Это то, что должен иметь ошибочный вопрос Аскер здесь сделанный.

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

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

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

хорошо, поэтому 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),
    ...
}

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

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

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

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

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

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

замена каждого "с \" не достаточно: Пользователь может ввести: \ и парсинг, опять же, терпит неудачу (подумайте, почему).

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

ответ на прямой вопрос:
Чтобы быть в безопасности, замените необходимый символ на \u+4-значный-шестнадцатеричное значение

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

ХОРОШАЯ ССЫЛКА: http://es5.github.io/x7.html#x7.8.4

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

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

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

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

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

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

что касается сообщения AlexB:

 \'  Apostrophe or single quote
 \"  Double quote

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

пример:

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

Comments

    Ничего не найдено.