Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как правильно передать JSON из JSTL в Java Script? (https://javascript.ru/forum/dom-window/64425-kak-pravilno-peredat-json-iz-jstl-v-java-script.html)

drno-reg 10.08.2016 13:43

Как правильно передать JSON из JSTL в Java Script?
 
Здравствуйте.

Пытаюсь из JSP передать JSON в JavaScript.

<c:set var="json_text">
    [{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]
    </c:set>

 <script type="text/javascript">
var jsonString='<c:out value="${json_text}"/>';
var jsonObj = JSON.parse(jsonString);
</script>



Воспроизводится ошибка
Uncaught SyntaxError: Unexpected token & in JSON at position 2

НО если взять и целиком скопировать содержимое
напрямую в Java script, то все работает.

<script type="text/javascript">
var jsonString='[{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]';
var jsonObj = JSON.parse(jsonString);
</script>



Подскажите где я допускаю ошибку.

laimas 10.08.2016 14:07

Цитата:

Сообщение от drno-reg
где я допускаю ошибку

В строке 6 jsonString не является JSON.

drno-reg 10.08.2016 14:35

Уточните пожалуйста свой ответ.

чем отличается тот случай от этого
var jsonString='[{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]';
?

laimas 10.08.2016 14:47

Цитата:

Сообщение от drno-reg
чем отличается тот случай от этого


var jsonString='<c:out value="${json_text}"/>';
alert(jsonString);
jsonString='[{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]';
alert(jsonString);

warren buffet 10.08.2016 14:52

Сначала надо вывести в лог или что там в жсп есть то, что получилось после

var jsonString='<c:out value="${json_text}"/>';

drno-reg 10.08.2016 14:54

Ваши сомнения понятны.
Предполагаете, что в jsonString='<c:out value="${json_text}"/>';
передается строка <c:out value="${json_text}"/>.
НО это не так, JSTL тег срабатывает и передает полностью значение.
Для проверки я сделал так
<script type="text/javascript">
var JSONFromJSTL='<c:out value="${json_text}"/>';
jsonResult.push("Вывод JSON="+JSONFromJSTL);
result_json.innerHTML = jsonResult.join('<br>');
  </script>


в
<div id="result_json"></div>

получаю такой результат

Вывод JSON=[{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]

Почему в случае var jsonString='<c:out value="${json_text}"/>';
должно все быть по-другому?

warren buffet 10.08.2016 14:55

laimas, да это же серверный шаблон, то есть этот JSP получает var jsonString='<c:out value="${json_text}"/>'; и что-то там себе на уме согласно его моделям и прототипам присваивает. Поэтому в строке уже не будет '<c:out value="${json_text}"/>', а должен быть тот текст, который внутри тега c:out. Но что именно там получается в этой фазе - хз. Это и надо выяснить.

laimas 10.08.2016 14:56

Цитата:

Сообщение от drno-reg
Предполагаете, что

Не предполагаю, а знаю, ибо даже если бы

var JSONFromJSTL='<c:out value="{"a":1}"/>';

это не будет являться JSON.

warren buffet 10.08.2016 14:57

drno-reg, так у тебя небось там все эти не альфа-нумерики кодируются для хтмля его ентитьками. То есть, тебе надо смотреть НЕ на страницу, а в исходник страницы, или выводить через функцию, которая обратно декодирует все ентитьки. А иначе откуда амперсанд.

warren buffet 10.08.2016 15:07

Ну то есть

Цитата:

Unexpected token & in JSON at position 2
На позиции 2 (zero-based) двойная кавычка, которая на выводе преобразуется в &quot; которую в хтмле при проверке ты видишь как двойную кавычку, а парсер охреневает. Открывай исходник веб-страницы и все увидишь.

warren buffet 10.08.2016 15:12

Цитата:

Сообщение от laimas
это не будет являться JSON.

Еще раз. Это инструкция сервера, а не данные для вывода. Сервер находит эту инструкцию и делает что должен как тот пианист. Ты вообще хоть один шаблон вывода в своей жизни видел?

laimas 10.08.2016 15:15

Цитата:

Сообщение от warren buffet
Это инструкция сервера, а не данные для вывода.

Ты дебил.

warren buffet 10.08.2016 15:19

Зато ты гений, так что сможешь прочесть https://en.wikipedia.org/wiki/JavaServer_Pages

laimas 10.08.2016 15:24

Еще раз - ты дебил:

try {
    var s = JSON.parse("<c:out />");
} catch (e) {
    alert(e)
}


Надоел твой срач на форуме. Мне нахрен не нужны твои тупые разъяснения.

warren buffet 10.08.2016 15:30

Цитата:

Сообщение от laimas
дебил

Да это я уже понял. Просто ты уже третий раз не можешь понять, что на выводе не будет никакого "<c:out />" в строке. Это служебная информация, не для вывода вообще. Я не знаю как тебе еще объяснять устройство шаблонов, поэтому иди кушай кашку.

laimas 10.08.2016 15:33

Цитата:

Сообщение от warren buffet
Просто ты уже третий раз не можешь понять, что на выводе не будет никакого "<c:out />" в строке.

Слушай, еще раз попадешься с тупыми советами мне, изловлю засранца и воткну твой тупой язык тебе в задницу. Это я тебе могу гарантировать.

Читай, знаток хренов - var jsonString='<c:out value="${json_text}"/>';

drno-reg 10.08.2016 15:40

вот так заработало

<script type="text/javascript">
    var jsonObj = ${json_text};
            var jsonResult = [];
            jsonResult.push("Вывод JSON="+'<c:out value="${json_text}"/>');
jsonResult.push("количество строк json="+jsonObj.length);
result_json.innerHTML = jsonResult.join('<br>');
 </script>

warren buffet 10.08.2016 15:42

Четвертый раз не хочет понять. Интересно до десяти домотает?

Цитата:

Сообщение от laimas
Читай, знаток хренов - var jsonString='<c:out value="${json_text}"/>';

Четвертый раз. Вот эту часть - '<c:out value="${json_text}"/>' - интепретатор должен заменить на то, что внутри этой части изложено как кусок шаблона. То есть программа найдет <c:out - это видимо namespace с тегами для заполнения буфера вывода, затем $ - это типа селектора видимо, который найдет тег со значением атрибута var="json_text", возьмет его содержание и вернет в исходную точку, то есть после var jsonString= и на выводе, на странице, должен получиться текст var jsonString=[{"TIME_STAMP"... и далее как там было. Понял?

warren buffet 10.08.2016 15:45

drno-reg, ты тоже похоже херней занимаешься. Найти в своем фрейморке теги вывода без преобразования в html entities.

laimas 10.08.2016 15:51

Цитата:

Сообщение от warren buffet
Вот эту часть - '<c:out value="${json_text}"/>' - интепретатор должен заменить на то

Какая программа, если это строковое значение явно прописанное переменной в JS? Свой срач адресуй кому угодно, меня для тебя нет на форуме.

warren buffet 10.08.2016 16:02

Цитата:

Сообщение от laimas
явно прописанное переменной в JS

Нет никакой переменной еще, это все еще текст и переменная и скаляр, который в рамках этого JSP может оказаться вовсе не скаляром. Откуда ты знаешь какое значение имеют одинарные кавычки в этой хренатени. Может быть такое же, как двойные в PHP.

Короче, пятый раз ты не хочешь понимать олень.

Если бы переменной присваивалось что написано - '<c:out value="${json_text}"' - то при выводе на страницу оно и было бы в точности как есть, а ТС пишет что на страницу выводится его json, а не эта хрень <c:out value="${json_text}" да и потом где тут & на символе с индексом 2?

warren buffet 10.08.2016 16:07

ТС, иди на форум по JSP и там узнавай как вывести json текст as is, без преобразования в ентитьки.

warren buffet 10.08.2016 16:16

У него вместо [{"TIME_STAMP":.. выводится [{&quot;TIME_STAMP&quot;:... поэтому дамп на веб-странице выглядит правильно, а парситься не желает. Дубовое решение заменить куоты на двойную кавычку

var jsonObj = JSON.parse(jsonString.replace(/&quot;/g,'"'));


Но лучше найти кто кодирует строку и сказать ему, что так делать не надо.


Часовой пояс GMT +3, время: 09:16.