Вот моя строка
{
'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:
Тем не менее, даже если это полностью противоречит спецификации, автор может использовать
\'
.Это плохо, потому что:
Но это работает, как вы хотите этого или нет.
Для новых читателей всегда используйте двойные кавычки для ваших строк JSON.
источник
JSON.parse("'foo'")
в консоли браузера, например, и наблюдайтеSyntaxError: Unexpected token '
. Спецификация JSON очень проста и понятна . В JSON нет escape-последовательности для одинарных кавычек, а строка JSON не может быть заключена в одинарные кавычки.'
, во многом таким же образом , что это технически верно , но вводит в заблуждение , чтобы сказать , что по закону вам не нужно детям убийство. Правильнее было бы сказать, что вы не можете убежать'
.\'
является недопустимой escape-последовательностью, и если вы используете ее, то ваш JSON не является допустимым JSON, и любой JSON-анализатор захлебнется им. (Конечно, JavaScriptJSON.parse
и Pythonjson.loads
делают.)\'
escape-последовательности «работает, как вы хотите или нет» . Это неверно Я призываю вас продемонстрировать любой парсер JSON в популярном использовании, который не захлебывается строками в одинарных кавычках или\'
последовательностью. Я уже указывал, чтоJSON.parse("'foo'")
иJSON.parse('"\\\'"')
(в JavaScript) иjson.loads("'foo'")
иjson.loads('"\\\'"')
(в Python) оба вызывают исключения. На чем основано утверждение, что использование этих конструкций "работает"?'
как\u0027
, а не то , что вы можете избежать как\'
.'
» (и сравниваю такой акт с убийством детей!) Технически неверен; Точнее сказать, что вы можете избежать этого, просто не так\'
. Я не осознавал, что версия спецификации RFC ссылается на последовательности как\u0027
способ «избежать» символов, которые они представляют. Ключевой момент, который\'
является незаконным, тем не менее, остается верным и важным.Я потрясен присутствием высокооплачиваемой дезинформации по такому часто обсуждаемому вопросу об основной теме.
Строки JSON нельзя заключать в одинарные кавычки . Различные версии спецификации ( оригинал Дугласа Крокфорда, версия ECMA и версия IETF ) утверждают, что строки должны заключаться в двойные кавычки. Это не теоретический вопрос и не вопрос мнения, как это принято в настоящее время; любой анализатор JSON в реальном мире выдаст ошибку, если вы попытаетесь проанализировать строку в одинарных кавычках.
Версия Крокфорда и ECMA даже отображает определение строки, используя красивую картинку, которая должна ясно дать понять смысл:
На симпатичной картинке также перечислены все допустимые escape-последовательности в строке JSON:
\"
\\
\/
\b
\f
\n
\r
\t
\u
с последующим четырехзначным числомОбратите внимание, что вопреки бессмыслице в некоторых других ответах здесь,
\'
никогда не допустимая escape-последовательность в строке JSON. Так не должно быть, потому что строки JSON всегда заключаются в двойные кавычки.Наконец, вам обычно не нужно думать о экранировании символов при программной генерации JSON (хотя, конечно, вы будете это делать при ручном редактировании, скажем, файла конфигурации на основе JSON). Вместо этого сформируйте структуру данных, которую вы хотите кодировать, используя любые типы карт, массивов, строк, чисел, логических и нулевых значений, которые есть у вашего языка, а затем закодируйте ее в JSON с помощью функции кодирования JSON. Такая функция, вероятно, встроена в любой язык, который вы используете, например, в JavaScript
JSON.stringify
, PHPjson_encode
или Python.json.dumps
, Если вы используете язык, который не имеет такой встроенной функциональности, вы можете найти библиотеку JSON для разбора и кодирования. Если вы просто используете язык или библиотечные функции для преобразования вещей в JSON и обратно, вам даже не нужно знать правила экранирования JSON. Вот что должен был сделать ошибочный вопрос, задаваемый здесь.источник
Все говорят о том, как избежать строкового литерала
'
в'
кавычках. Здесь есть гораздо большая проблема: строковые литералы в одинарных кавычках не являются допустимыми JSON . JSON основан на JavaScript, но это не одно и то же. Если вы пишете литерал объекта внутри кода JavaScript, хорошо; если вам действительно нужен JSON, вам нужно использовать"
.С двойными кавычками вам не нужно будет избегать
'
. (И если вы хотите получить литерал"
в строке, вы бы использовали\"
.)источник
'
. Например, если у меня есть строковое значение"Member's_id" : 4
, вы говорите, что его не нужно экранировать? По-видимому, у меня проблема, когда он выдает ошибку неправильной кодировки: UTF-8 и читается какMember�s
. Это сгенерированный вручную файл JSON.'
в строковом литерале JSON нельзя экранировать. Вы скопировали и вставили это откуда-то? Может быть, это действительно, а\u2019
не апостроф. Мое предположение: кто-то напечатал его в MS Word, который превратил его в кавычку, потому что он думает, что знает лучше. Грамматически, старый добрый апостроф символа ASCII (или'
известный\x27
как «одинарная кавычка» до сих пор) - это то, что вам нужно. Но все равно было бы неплохо исправить проблему кодировки вашего персонажа на случай, если возникнут другие подобные проблемы. Поэтому выберите кодировку символов и используйте ее как для чтения, так и для записи. Или уйти, используя\u
.Большинство из этих ответов либо не отвечают на вопрос, либо излишне длинны в объяснении.
Итак, JSON использует только двойные кавычки, мы получаем это!
Я пытался использовать JQuery AJAX для отправки данных JSON на сервер, а затем позже вернуть ту же информацию. Лучшее решение вопроса, который я нашел, было использовать:
Это спасет персонажей для вас.
Это также было предложено Марком Амери, отличный ответ, кстати
Надеюсь, это кому-нибудь поможет.
источник
Может быть, я опоздал на вечеринку, но это будет разбор / побег одиночной кавычки (не хочу вступать в битву при разборе против побега) ..
источник
Ответьте на прямой вопрос:
для безопасности замените требуемый символ на \ u + 4-значный-hex-значение
Пример: если вы хотите избежать апострофа, замените его на \ u0027.
D'Amico становится D \ u0027Amico.
ОТЛИЧНАЯ ССЫЛКА: http://es5.github.io/x7.html#x7.8.4
https://mathiasbynens.be/notes/javascript-escapes
источник
\'
.Используйте encodeURIComponent () для кодирования строки.
Например. var product_list = encodeURIComponent (JSON.stringify (product_list));
Вам не нужно декодировать его, так как веб-сервер автоматически делает то же самое.
источник
Использование литералов шаблона ...
источник
Я думаю, что мы все согласны, что jsons с одинарными кавычками не настоящие jsons. Как бы то ни было, нам все еще нужно решить вопрос о том, чтобы уйти "внутри строки json в двойных кавычках, в отсутствие библиотек, чтобы сделать это для нас.
Замена каждого «на \» НЕ ДОСТАТОЧНА: пользователь может ввести ввод: \, и синтаксический анализ, опять же, не удастся (подумайте почему).
Вместо этого сначала замените каждый \ на \ (двойной обратный слеш). Только тогда замените каждое "с \" (обратный слеш с последующим ").
источник
Чтобы разрешить одинарные кавычки в строке двойных кавычек для целей json, вы удваиваете одинарные кавычки. {"X": "Что за вопрос"} ==> {"X": "Что за вопрос"}
/codereview/69266/json-conversion-to-single-quotes
Последовательность неверна.
источник
относительно сообщения AlexB:
экранирование одинарных кавычек допустимо только в строках json с
одинарными кавычками экранирование двойных кавычек допустимо только в строках json с двойными кавычками
пример:
источник