LINUX.ORG.RU

JS. Проблема с конвертацией из JSON в массив

 ,


0

1
var chapters = JSON.parse('["<p align=\"left\">***</p>\n<p align=\"left\">&nbsp;</p>\n<p align=\"left\">Шли навстречу Толя с Колей,</p>\n<p align=\"left\">Сто бутылок волоча.</p>\n<p align=\"left\">Говорят, они искали</p>\n<p align=\"left\">Старика Хоттабыча!</p>\n<p align=\"left\">&nbsp;</p>\n<p align=\"left\">***</p>\n<p align=\"left\">&nbsp;</p>\n<p align=\"left\">Любят маленькие детки</p>\n<p align=\"left\">Всевозможные конфетки.</p>\n<p align=\"left\">Кто грызет, а кто глотает,</p>\n<p align=\"left\">Кто за щечкою катает.</p>\n<p align=\"left\">&nbsp;</p>\n<p align=\"left\">***</p>\n<p align=\"left\">&nbsp;</p>\n<p align=\"left\">По-геройски Лена с ленью</p>\n<p align=\"left\">Воевала целый день,</p>\n<p align=\"left\">Но, к большому огорченью,</p>\n<p align=\"left\">Победила Лену лень.</p>"]');

Есть такие данные в JSON, при конвертации возникает следующая ошибка:

SyntaxError: JSON.parse: expected ',' or ']' after array element at line 1 column 13 of the JSON data

Буду благодарен за помощь.

★★

сравни вывод:

'\"<p align=\\\"left\\\">***\"';
'\"<p align=\"left\">***\"';
затем сравни вывод:
JSON.parse('\"<p align=\\\"left\\\">***\"');
JSON.parse('\"<p align=\"left\">***\"');

anonymous
()
Ответ на: комментарий от anonymous

Ну сравнил: с тремя обратными слэшами работает нормально. В данном случае образуется новая проблема: почему JSON.stringify упаковывает массив таким образом?

Razip ★★
() автор топика
Ответ на: комментарий от Razip

и ещё вопрос, а почему тогда эти две строчки одно и то же дают, как думаешь?

JSON.stringify('<p align=\"left\">***')
'\"<p align=\\\"left\\\">***\"'

anonymous
()
Ответ на: комментарий от Razip

проверь, открой консоль любимого браузера и попробуй.

anonymous
()
Ответ на: комментарий от Razip

копирование - зло, большие примеры - зло. смотреть в сторону экранирования символов в js строках.

anonymous
()
Ответ на: комментарий от Razip
JSON.parse('["<p align=\\"left\\">***</p>\\n'+
  '<p align=\\"left\\">&nbsp;</p>\\n'+
  '<p align=\\"left\\">Шли навстречу Толя с Колей,</p>\\n'+
  '<p align=\\"left\\">Сто бутылок волоча.</p>\\n'+
  '<p align=\\"left\\">Говорят, они искали</p>\\n'+
  '<p align=\\"left\\">Старика Хоттабыча!</p>\\n'+
  '<p align=\\"left\\">&nbsp;</p>\\n'+
  '<p align=\\"left\\">***</p>\\n'+
  '<p align=\\"left\\">&nbsp;</p>\\n'+
  '<p align=\\"left\\">Любят маленькие детки</p>\\n'+
  '<p align=\\"left\\">Всевозможные конфетки.</p>\\n'+
  '<p align=\\"left\\">Кто грызет, а кто глотает,</p>\\n'+
  '<p align=\\"left\\">Кто за щечкою катает.</p>\\n'+
  '<p align=\\"left\\">&nbsp;</p>\\n'+
  '<p align=\\"left\\">***</p>\\n'+
  '<p align=\\"left\\">&nbsp;</p>\\n'+
  '<p align=\\"left\\">По-геройски Лена с ленью</p>\\n'+
  '<p align=\\"left\\">Воевала целый день,</p>\\n'+
  '<p align=\\"left\\">Но, к большому огорченью,</p>\\n'+
  '<p align=\\"left\\">Победила Лену лень.</p>"]');
anonymous
()
Ответ на: комментарий от Razip

хорошо, рассмотрим такой фрагмент:

JSON.parse('["<p align=\"left...
что видит JSON.parse:

  • о, появилась [, значит на вход нам дали JSONArray, отлично...
  • нашлась строка заключенная в кавычки "<p align=\", наверное сейчас появится , или ]
  • l??? что это, как это разбирать, паника, ПАНИКА!!!
anonymous
()
Ответ на: комментарий от anonymous

Я запутался. При \" одно работает, другое — нет. Работающий вариант (хотя stringify возвращает строку с \"):

JSON.parse(JSON.stringify(['"""""']))
Но если попробовать так:
JSON.parse('["\"\"\"\"\""]')
//SyntaxError: JSON.parse: expected ',' or ']' after array element at line 1 column 4 of the JSON data
То все ломается.

Razip ★★
() автор топика
Ответ на: комментарий от anonymous

Т.е. stringify-метод возвращает строку со слэшами, а при самостоятельном создании строки они воспринимаются как специальные символы и пропадают? Проблема в том, что у меня вставка значения переменной происходит на сервере и я не знаю другого способа передать строку так, чтобы ее слэши не воспринимались как специальные символы.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

Т.е. stringify-метод возвращает строку со слэшами, а при самостоятельном создании строки они воспринимаются как специальные символы и пропадают?

ага

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

это твои проблемы, как бы грубо это не звучало. строка в js всегда воспринимается с учетом символов экранирования.

anonymous
()
Ответ на: комментарий от Razip

Есть конечно вариант с помощью сервера заменять один слэш на три, но другого выхода нет?

Razip ★★
() автор топика
Ответ на: комментарий от anonymous

Особой разницы между \\ и \\\ не будет т.к. это реализуется через один и тот же алгоритм (я про замену). Данные берутся с БД, в БД пишутся с клиента. Язык — PHP.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

JS на клиенте генерирует JSON и подсовывает в поле формы при отправке.

Razip ★★
() автор топика
Ответ на: комментарий от ZuBB

Стоит прочитать два последних моих сообщения. JSON строится на клиенте, а сервер просто достает/записывает его из/в БД.

Razip ★★
() автор топика
Последнее исправление: Razip (всего исправлений: 1)
Ответ на: комментарий от Razip

ок, я уточню

надеюсь все манипуляции с JSON производятся встроенными (и проверенными) средствамми, а не самописными костылями?

ZuBB ★★★★★
()
Последнее исправление: ZuBB (всего исправлений: 1)
Ответ на: комментарий от ZuBB

Razip

JSON строится на клиенте, а сервер просто достает/записывает его из/в БД.

Спасибо конечно за рвение помочь, но вопрос уже решен. Решился Twig-фильтром escape('js') (проект на Symfony2).

Razip ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.