Это не проблема с JSON, это проблема вашего неправильного использования HTML.
Вы вставили необработанную строку в атрибут HTML, возможно, из шаблона, возможно, выполнив что-то вроде
<button data-obj="<?php echo json_encode($data); ?>">
Или, возможно, в JavaScript
container.innerHTML = '<button data-obj="' + JSON.stringify(data) + '">';
так что ваши кавычки в конечном итоге конфликтуют с HTML. Вам нужно изменить ваши кавычки на HTML-сущности; минимум - это двойные кавычки "
в "
, если вы используете двойные кавычки вокруг атрибута HTML (самый распространенный сценарий).
Вы не сказали нам, как вставить контент в HTML, поэтому я не могу рассказать вам, как это сделать, пока вы не укажете.
РЕДАКТИРОВАТЬ: Очевидно, вы строите HTML в JavaScript путем конкатенации. В этом случае решение, которое я показал, будет работать:
container.innerHTML = '<button data-obj="' + data_array.replace(/"/g, '"') + '">';
Или, если вы используете одинарные кавычки для включения атрибута (обычно это не делается, но, безусловно, вариант), вам нужно изменить эти на '
вместо:
container.innerHTML = "<button data-obj='" + data_array.replace(/'/g, ''') + "'>";
Однако, учитывая, что речь идет о JavaScript, и он может работать с DOM, и DOM знает, что к чему ... есть много других решений. Наиболее примитивным является работа с DOM напрямую:
let button = document.createElement('button');
button.setAttribute('data-obj', data_array);
container.appendChild(button);
Когда вы делаете это, JavaScript манипулирует DOM напрямую, а не HTML, поэтому экранирование не требуется.
Уровень выше этого будет использовать библиотеку, как jQuery:
$('<button>').data('obj', data_array).appendTo('#container');
Уровень, еще выше, который будет использовать библиотеку, которая использует привязку данных, такую как Angular, React, Vue, Ractive ..., где вы просто устанавливаете значение для вашей модели, и документ автоматически отражает это изменение.
Изменение вручную "
в "
необходимо только в том случае, если вы непосредственно манипулируете HTML.