Как кодировать json и специальные символы с php на javascript?

В моей базе данных я сохраняю 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/

Почему вы храните &quot; в своей базе данных вместо "? Прекрати эту ерунду.

CBroe 03.04.2018 14:26

@CBroe, независимо от причины, которую я мог преобразовать, прежде чем сохранять, мне просто интересно, почему это не работает ...

rob.m 03.04.2018 14:30

есть законные причины для html-кодирования строки json, я иногда делаю это, когда сохраняю материал в атрибуте данных. обычно не будет хранить его в таком состоянии долгое время.

I wrestled a bear once. 03.04.2018 15:06

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

rob.m 03.04.2018 15:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
4
461
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

$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...
});

да, это красиво, еще более упрощено, если вы поместили все в одну строку. Большое спасибо

rob.m 03.04.2018 14:53

Проблема заключается в кавычках внутри строки "mama", которые вам нужно экранировать с помощью метода addslashes.

Попробуйте использовать следующее:

var data = "<?php echo addslashes(htmlspecialchars_decode($jsonTable)); ?>";

@ Occam'sRazor Чуть ниже он выполняет JSON.parse для синтаксического анализа строки в JSON.

Farhan Tahir 03.04.2018 14:33

точно, я потом делаю JSON.parse .. приму через минуту. Просто я знаю, что было неправильным в том, что я делал?

rob.m 03.04.2018 14:34

да, моя плохая. +1. я не ожидал, что он конвертирует данные из строки в json, обратно в строку, а затем обратно в json .. не ожидал этого .. следовало бы прочитать поближе ..

I wrestled a bear once. 03.04.2018 14:35

@ Occam'sRazor да, это очень странный и долгий путь, на самом деле то, что я делаю, не могли бы вы, ребята, помочь мне упростить это?

rob.m 03.04.2018 14:36

@ rob.m На самом деле, когда вы выводите строку с php на javascript с двойными кавычками в ней, таким образом, строка, начинающаяся с двойных кавычек и имеющая в ней двойные кавычки, нарушает JS. `" [{"Mamma": ["Papa"]}] "` и javascript жалуется на это. если бы было так: "[{'Mamma':['Papa']}]"

Farhan Tahir 03.04.2018 14:37

@ rob.m да, лучшим методом было бы использовать json_encode, а затем выполнить JSON.parse (), а не повторить ответ.

Farhan Tahir 03.04.2018 14:38

так есть ли способ упростить?

rob.m 03.04.2018 14:38

@ rob.m - все, что вам нужно сделать, это удалить кавычки вокруг эха, как я упоминал в своем ответе, а затем удалить строку js, которая анализирует, как json. это уже JSON, вам не нужно его разбирать, если вы не превратите его в строку. это был бы отличный вопрос для codereview.stackexchange.com

I wrestled a bear once. 03.04.2018 14:39

@ Occam'sRazor Я согласен.

Farhan Tahir 03.04.2018 14:39

нет, вам не нужно кодировать json. просто повторите его как есть, без окружающих кавычек.

I wrestled a bear once. 03.04.2018 14:39

@ Occam'sRazor хорошо, тогда позвольте мне попробовать по-вашему, не видел, чтобы удалить PARSE

rob.m 03.04.2018 14:39

@ Occam'sRazor вещь в том, что мне все равно нужно конвертировать &quot;

rob.m 03.04.2018 14:40

@ rob.m - правильно .. var data = <?php echo htmlspecialchars_decode($jsonTable); ?>; затем закомментируйте / удалите строку с помощью JSON.parse

I wrestled a bear once. 03.04.2018 14:41

@ Occam'sRazor Я пробовал это раньше, и он дает мне Uncaught SyntaxError: Unexpected identifier, единственный способ, которым он работает, - использовать код в этом ответе

rob.m 03.04.2018 14:43

@ Occam'sRazor держитесь, вы правы. Я оставил $jsonTable = json_encode($jsonTable);, удаляя это работает! Большое спасибо

rob.m 03.04.2018 14:44

@ rob.m - рад, что вы упростили. будущие разработчики будут вам благодарны.

I wrestled a bear once. 03.04.2018 14:44

@ Occam'sRazor не могли бы вы использовать это в качестве ответа для будущих разработчиков? Я мог бы сделать это сам, но решение ваше, это код: <?php $jsonTable = usp_get_meta(false, 'usp-custom-12'); ?> var data = <?php echo htmlspecialchars_decode($jsonTable); ?>;

rob.m 03.04.2018 14:45

@ Occam'sRazor да, это было бы здорово.

Farhan Tahir 03.04.2018 14:51

JSON в PHP:

json_decode($string);

Если вы используете необязательный параметр $assoc как true - json_decode($string, true) вернет ассоциативный массив в случае успеха.

PHP в JSON:

json_encode($array);

Руководства по PHP: json_encode ()json_decode ()

Другие вопросы по теме