В моей базе данных я сохраняю json в настраиваемом поле под названием usp-custom-12 следующим образом:
[{"Mamma":["Papa"]}]
Затем я пытаюсь расшифровать это
<?php
$jsonTable = usp_get_meta(false, 'usp-custom-12');
?>
var data = <?php echo htmlspecialchars_decode($jsonTable); ?>;
Но это дает мне
var data = "[{"Mamma":["Papa"]}]";
И ошибка журнала консоли:
Uncaught SyntaxError: Unexpected identifier
Полный код:
<?php
$jsonTable = usp_get_meta(false, 'usp-custom-12');
?>
var data = "<?php echo htmlspecialchars_decode($jsonTable); ?>";
console.info(data);
data = JSON.parse (data);
data.forEach(obj => {
Object.keys(obj).forEach(key => {
$('#newTable thead tr').append($('<th>').text(key));
obj[key].forEach((e, i) => {
if (!$("#newTable tbody tr:eq("+i+")").length) $("<tr>").appendTo($("#newTable tbody"));
$("#newTable tbody tr:eq(" + i + ")").append($('<td>').text(e))
})
})
});
В этом jsFiddle, если вы нажмете сохранить таблицу, вы увидите, что он генерирует таблицу, идентичную верхней, которая также регистрирует в консоли правильный json: https://jsfiddle.net/fbh0o67o/74/
@CBroe, независимо от причины, которую я мог преобразовать, прежде чем сохранять, мне просто интересно, почему это не работает ...
есть законные причины для html-кодирования строки json, я иногда делаю это, когда сохраняю материал в атрибуте данных. обычно не будет хранить его в таком состоянии долгое время.
tbh это плагин для wordpress, который хранит данные с такими специальными символами, я действительно мог бы преобразовать его перед сохранением, но поскольку это не самая большая проблема, и я не хочу ни изменять плагин, я оставляю его таким и просто используйте ответы здесь, чтобы устранить эхо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


$jsonTable содержит строку JSON с закодированными объектами html, поскольку это уже JSON, вам просто нужно декодировать данные HTML и повторить его как есть. Декодирование JSON не требуется, цитирование не требуется. Просто декодируйте HTML и введите его в свой javascript.
var data = <?php echo htmlspecialchars_decode(usp_get_meta(false, 'usp-custom-12')); ?>;
data.forEach(obj => {
// Loop stuff here...
});
да, это красиво, еще более упрощено, если вы поместили все в одну строку. Большое спасибо
Проблема заключается в кавычках внутри строки "mama", которые вам нужно экранировать с помощью метода addslashes.
Попробуйте использовать следующее:
var data = "<?php echo addslashes(htmlspecialchars_decode($jsonTable)); ?>";
@ Occam'sRazor Чуть ниже он выполняет JSON.parse для синтаксического анализа строки в JSON.
точно, я потом делаю JSON.parse .. приму через минуту. Просто я знаю, что было неправильным в том, что я делал?
да, моя плохая. +1. я не ожидал, что он конвертирует данные из строки в json, обратно в строку, а затем обратно в json .. не ожидал этого .. следовало бы прочитать поближе ..
@ Occam'sRazor да, это очень странный и долгий путь, на самом деле то, что я делаю, не могли бы вы, ребята, помочь мне упростить это?
@ rob.m На самом деле, когда вы выводите строку с php на javascript с двойными кавычками в ней, таким образом, строка, начинающаяся с двойных кавычек и имеющая в ней двойные кавычки, нарушает JS. `" [{"Mamma": ["Papa"]}] "` и javascript жалуется на это. если бы было так: "[{'Mamma':['Papa']}]"
@ rob.m да, лучшим методом было бы использовать json_encode, а затем выполнить JSON.parse (), а не повторить ответ.
так есть ли способ упростить?
@ rob.m - все, что вам нужно сделать, это удалить кавычки вокруг эха, как я упоминал в своем ответе, а затем удалить строку js, которая анализирует, как json. это уже JSON, вам не нужно его разбирать, если вы не превратите его в строку. это был бы отличный вопрос для codereview.stackexchange.com
@ Occam'sRazor Я согласен.
нет, вам не нужно кодировать json. просто повторите его как есть, без окружающих кавычек.
@ Occam'sRazor хорошо, тогда позвольте мне попробовать по-вашему, не видел, чтобы удалить PARSE
@ Occam'sRazor вещь в том, что мне все равно нужно конвертировать "
@ rob.m - правильно .. var data = <?php echo htmlspecialchars_decode($jsonTable); ?>; затем закомментируйте / удалите строку с помощью JSON.parse
@ Occam'sRazor Я пробовал это раньше, и он дает мне Uncaught SyntaxError: Unexpected identifier, единственный способ, которым он работает, - использовать код в этом ответе
@ Occam'sRazor держитесь, вы правы. Я оставил $jsonTable = json_encode($jsonTable);, удаляя это работает! Большое спасибо
@ rob.m - рад, что вы упростили. будущие разработчики будут вам благодарны.
@ Occam'sRazor не могли бы вы использовать это в качестве ответа для будущих разработчиков? Я мог бы сделать это сам, но решение ваше, это код: <?php $jsonTable = usp_get_meta(false, 'usp-custom-12'); ?> var data = <?php echo htmlspecialchars_decode($jsonTable); ?>;
@ Occam'sRazor да, это было бы здорово.
JSON в PHP:
json_decode($string);
Если вы используете необязательный параметр $assoc как true - json_decode($string, true) вернет ассоциативный массив в случае успеха.
PHP в JSON:
json_encode($array);
Руководства по PHP: json_encode ()json_decode ()
Почему вы храните
"в своей базе данных вместо"? Прекрати эту ерунду.