2015-09-25 2 views
-1

Скажем, у меня есть довольно простой метод, как показано ниже:Как передать строку JSON в качестве аргумента?

var foo = function (str) { 
    console.log(str); //{"Field Name": "Value With "Escaped" Content"} 
    JSON.parse(str); //fails 
} 

foo('{"Field Name": "Value With \"Escaped\" Content"}'); 

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

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

+0

вы убегаете '" ', потому что в этом контексте вы объявляете строку (кстати бесполезную, потому что в окружении простых кавычек), вы не создайте избежали двойных кавычек – Hacketo

+0

возможного дубликата [Получить обратный слэши внутри строки - JavaScript] (HTTP: //stackoverflow.com/questions/10041998/get-backslashes-inside-a-string-javascript) – Hacketo

+0

Вы копируете и вставляете этот JSON в свой исходный код для тестирования, но на практике строка будет поступать из некоторого API? Тогда у вас даже не будет этой проблемы на практике! В противном случае уточните, откуда взялась эта строка и что вы с ней делаете. – deceze

ответ

2

Знаки \ являются символами escape-кода JSON, но они также являются символами escape-кода JavaScript.

У вас есть строковый литерал JavaScript. Когда это анализируется компилятором JavaScript, \" будет интерпретирован как ".

Анализатор JSON поэтому проходит ", а не \".

Могу ли я избежать проблемы без ручного двойного экранирования строки?

Строка должна быть удвоена. Вы можете или не должны делать это вручную в зависимости от того, откуда взялась строка.

Почему не использует одиночные косые черты вокруг самой строки, избегая этой проблемы?

Поскольку язык JavaScript не говорит о том, что символы \ не являются символами escape в одиночных кавычках.

+0

Возможно ли получить исходную входную строку без ее анализа? – Nit

+0

@Nit связанное состояние сообщения 'String.raw' ES6 – Hacketo

+1

Только путем доступа к необработанному JavaScript и написанию настраиваемого анализатора. (Это был бы глупый подход к решению проблемы). – Quentin

Смежные вопросы