2017-01-14 2 views
0

Я извлекаю код JSON, хранящийся в MySQL, и он имеет дополнительные слэши, которые я должен удалить, чтобы разобрать его на JavaScript после того, как я распечатаю его на странице. Сейчас я делаю следующее:«Исправление» JSON, исходящее из MySQL

$save = str_replace("\n", "<br>", $save); // Replace new line characters with <br> 
$save = str_replace('\\"', '"', $save); // top-level JSON 
$save = str_replace('\\\\"', '\"', $save); // HTML inside top level JSON 
$save = str_replace('\\\\\\\\\\"', '\\\\\"', $save); // HTML inside second level JSON 

Вот пример JSON-код, так как он выходит из MySQL:

{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]} 

А вот как это должно выглядеть, чтобы получить разобран правильно (с использованием jsonlint.com для проверки):

{"id":2335,"editor":{"selected_shape":"spot-7488"},"general":{"name":"HTML Test","shortcode":"html-test","width":1280,"height":776},"spots":[{"id":"spot-7488","x":9.9,"y":22.6,"default_style":{"use_icon":1},"tooltip_content":{"content_type":"content-builder","plain_text":"<p class=\"test\">Test</p>","squares_json":"{\"containers\":[{\"id\":\"sq-container-293021\",\"settings\":{\"elements\":[{\"settings\":{\"name\":\"Paragraph\",\"iconClass\":\"fa fa-paragraph\"},\"options\":{\"text\":{\"text\":\"<p class=\\\"test\\\">Test</p>\"}}}]}}]}"}}]} 

Пожалуйста, обратите внимание, что у меня есть HTML-код в формате JSON, который находится внутри другого JSON и это, где это становится немного грязным.

Мой вопрос - есть ли функция или библиотека для PHP (для JS тоже будет работать), который охватывает все эти угловые случаи, потому что я уверен, что кто-то найдет способ разбить скрипт.

Спасибо!

+1

Попробуйте стрипы? (http://php.net/stripslashes) Хотя, если у вас есть HTML-код, нет гарантии, что что-то не сломается. Вам действительно нужно исправить это в источнике, если сможете. –

+0

Что значит «исправить это у источника»? –

+0

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

ответ

0

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

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

Slashes обычно добавляют в PHP в нескольких случаях:

  • magic_quotes включены. Это старая функция PHP, которая была удалена. Основная идея заключается в том, что PHP используется для автоматического сбережения котировок входящих запросов, чтобы вы могли вставлять входящие строки в db. Угадай, что? НЕ БЕЗОПАСНО.

  • add_slashes был вызван. Зачем это так? Некоторые люди используют его как неправильное средство для избежания данных, прежде чем вставлять материал в db. Другие используют его, чтобы HTML не нарушался при переходе от переменных (вместо этого, вероятно, следует использовать htmlspecialchars). Он также может пригодиться во множестве других ситуаций, когда вы определяете код в строке.

  • При выходе из ввода данных. Наиболее распространенной функцией экранирования является mysqli_real_escape_string. Очень важно избегать значений, прежде чем вставлять их в db для предотвращения внедрения SQL и других эксплойтов, но вам никогда не следует избегать вещей дважды.

Таким образом, есть вероятность того, что ваш код дважды спасаясь вещи или что addslashes становится называется или что-то вроде magic_quotes вызывает проблему, но я подозреваю, что это еще одна проблема: некоторые JS код может поставлять этот JSON не является надлежащей строкой JSON, а тем, что было экранировано так, чтобы определить строку в javascript.

Если взять пример JSON строку выше, и хлопнуть некоторые цитаты вокруг него:

var myJSON = "<put your string here>"; 

затем СЮРПРИЗ Ваш браузер не сломаны, а переменная myJSON содержит строку, которая фактически действует в формате JSON и может быть разобран в действительный объект JSON:

var myJSON = "{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]}"; 
console.log(JSON.parse(myJSON)); // this is an actual object 

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

EDIT:

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

var myObj = {"key":"here is my value"}; 
console.log(myObj); 
var myJSON = JSON.stringify(myObj); 
console.log(myJSON); 
var doubleEncoded = JSON.stringify(myJSON); 
console.log(doubleEncoded); 
+0

Очень простое решение, я должен был попытаться разобрать JSON в javascript напрямую, не пытаясь вручную удалить слэши :) –

+0

Я бы предложил вам изучить входной этап для этого JSON и выяснить, можете ли вы избежать кодирования их в первом место. Вероятно, есть слишком много звонков в JSON.stringify или что-то в этом роде. Когда ваш JSON приходит на PHP, в идеале он не должен иметь все лишние косые черты. –

Смежные вопросы