JSON Parse Неожиданный токен h вызвал кавычки внутри строкового значения - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть строка JSON, которую я получил из таблицы, вот мой JSON

    {"subtitle":"Information","desc":"Hi, Welcome.\\n                            <br><br>\\n                            You can access our website <a href=\\"https://test.com\\">here</a>.\\n                            <br><br>\\n                            Dont forget, cost: only $2! \\n                            <br>\\n                            <br>\\n                            <br>\\n                            <br>\\n                            Thankyou,<br>\\n                            Regards"}

, когда я пытаюсь сделать json.parse(), но я получил ошибку

SyntaxError: Неожиданный токен h в JSON в позиции 154 .

Я думал, что это вызвано из-за кавычек " в URL или двоеточии :.

Как я могу передать их JSON?

Обновление

Вот как я получил данные:

var body_inbox = {};
body_inbox.subtitle = 'Information';
body_inbox.desc = `Hi, Welcome.
                    <br><br>
                    You can access our website <a href="https://test.com">here</a>.
                    <br><br>
                    Dont forget, cost: only $2!
                    <br>
                    <br>
                    <br>
                    <br>
                    Thankyou,<br>
                    Regards`;

body_inbox = JSON.stringify(body_inbox);

Я Путаница, я нашел много данных в таблице, что данные имеют двойной backsla sh в новой строке \\n и в URL <a href=\\"https://test.com\\">here</a>. Я просто пытаюсь создать новые данные с помощью JSON .stringify, и в результате получим \n и <a href=\"https://test.com\">here</a>. Почему это происходит?

Примечание

Извините, вводит в заблуждение более ранняя информация - опечатка.

Должно быть <a href=\\"https://test.com\\">, а не <a href="\\https://test.com\\">

Ответы [ 4 ]

2 голосов
/ 02 апреля 2020

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

{"subtitle":"Information","desc":"Hi, Welcome.\\n                            <br><br>\\n                            You can access our website <a href=\"https://test.com\">here</a>.\\n                            <br><br>\\n                            Dont forget, cost: only $2! \\n                            <br>\\n                            <br>\\n                            <br>\\n                            <br>\\n                            Thankyou,<br>\\n                            Regards"}
2 голосов
/ 02 апреля 2020

Используйте строку шаблона для сохранения данных.

const json = `{"subtitle":"Information","desc":"Hi, Welcome.\\n<br><br>\\nYou can access our website <a href=\\"https://test.com\\">here</a>.\\n<br><br>\\nDont forget, cost: only $2!\\n<br>\\n<br>\\n<br>\\n<br>\\n Thankyou,<br>\\n Regards"}`
console.log(JSON.parse(json))
2 голосов
/ 02 апреля 2020

Двойная обратная косая черта должна быть одинарной обратной косой чертой. Единственная обратная коса sh экранирует следующий символ, поэтому то, что вы делаете с двойной строкой, - это вторая обратная коса sh. Он задыхается от href, потому что следующая кавычка заканчивает строку, после чего парсер нажимает 'h' в URL как необработанный символ.

{ message: "...our website <a href=\\"https://test.com\\">here</a>" }
//                                   ^ parser thinks the string ends here
//                                     and doesn't know what to make of
//                                     https://...

Я предполагаю, что данные были экранированы дважды два разных процесса (или один и тот же процесс выполняется дважды).

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

Подобные вещи можно увидеть, дважды убрав строку в консоли. (Это не делает обратную косую черту, но демонстрирует проблему):

const input = '"This string is quoted."';

const once = encodeURI(input);
// encodes the quotes as '%22'
// "%22This%20string%20is%20quoted.%22"

const twice = encodeURI(once);
// encodes the '%' in '%22' as '%25', and you end up with `%2522`
// "%2522This%2520string%2520is%2520quoted.%2522"
0 голосов
/ 09 апреля 2020

(Опубликовал ответ от автора вопроса, чтобы переместить его в область ответов) .

Большое спасибо за все ответы. Помогло выяснить, что анализ не удался из-за двойного обратного слэса sh, который экранирует второй обратный слэс sh, а не двойные кавычки ".

Данные имеют двойную обратную косую черту sh, поскольку это данные из клонированной базы данных, я думал, что это произойдет во время преобразования в файл SQL.

...