Почему json кодирует добавление обратных косых черт?


Я использую json_encode в течение длительного времени, и до сих пор у меня не было никаких проблем. Теперь я работаю со сценарием загрузки и пытаюсь вернуть некоторые данные JSON после загрузки файла.

У меня есть следующий код:

print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON

Это дает мне следующие результаты:

// print_r result
Array
(
    [logo_url] => http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg
    [img_id] => 54
    [feedback] => Array
        (
            [message] => File uploaded
            [success] => 1
        )

)

// Echo result
{"logo_url":"http:\/\/mysite.com\/uploads\/gallery\/7f\/3b\/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}

Кто-нибудь может сказать мне, почему json_encode добавляет косые черты?

Обновление

@Квентин сказал, что что-то происходит между json_encode и .parseJSON, и он прав.

Выполнение alert(data.toSource()); дает мне следующий результат:

({response:"{\"logo_url\":\"http:\\/\\/storelocator.com\\/wp-content\\/uploads\\/gallery\\/7f\\/3b\\/71b9520cfc91a90afbdbbfc9d2b2239b_logo.jpeg\",\"img_id\":\"62\",\"feedback\":{\"message\":\"File uploaded\",\"success\":true}}", status:200})

И это недопустимый JSON. Он также добавляет status:200, и я понятия не имею, откуда это взялось.

Может ли быть так, что Plupload bind что-то делает с моими возвращенными данными?

Это мой js-скрипт:

  uploader.bind('FileUploaded', function(up, file, data) {
    alert(data.toSource());
    $('#' + file.id + " b").html("100%");
  });
 34
Author: Steven, 2012-04-25

6 answers

Кто-нибудь может сказать мне, почему json_encode добавляет косые черты?

Символы прямой косой черты могут вызывать проблемы (если им предшествует <, это запускает правила SGML для "конца элемента сценария") при внедрении в элемент сценария HTML. Они спасаются бегством в качестве меры предосторожности.

Потому что, когда я пытаюсь использовать jQuery.parseJSON(ответ); в моем js-скрипте он возвращает значение null. Так что я предполагаю, что это как-то связано с косыми чертами.

Это не так. В JSON "/" и "\/" эквивалентны.

JSON, указанный вами в вопросе, является допустимым (вы можете проверить его с помощью jsonlint). Ваша проблема, скорее всего, связана с тем, что происходит с ней между json_encode и parseJSON.

 33
Author: Quentin, 2012-04-25 11:34:41

Просто используйте опцию "JSON_UNESCAPED_SLASHES" (добавлена после версии 5.4).

json_encode($array,JSON_UNESCAPED_SLASHES);
 49
Author: reirracon, 2016-07-06 17:01:30

Я тоже только что столкнулся с этой проблемой в некоторых своих сценариях, и, похоже, это происходило потому, что я применял json_encode к массиву, заключенному в другой массив, который также был закодирован в json. Это легко сделать, если у вас есть несколько циклов foreach в сценарии, которые создают данные. Всегда применяйте json_encode в конце.

Вот что происходило. Если вы сделаете:

$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);

Результат таков:

["{\"test\":\"2\"}","{\"test\":\"four\"}"]

Итак, что вам на самом деле нужно сделать, это:

$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);

И это будет возврат

[{"test":"2"},{"test":"four"}]
 24
Author: Meezaan-ud-Din, 2018-06-21 10:44:19

Это происходит потому, что формат JSON использует "" (кавычки), и все, что находится между этими кавычками, является полезной информацией (либо ключом, либо данными).

Предположим, что ваши данные были: He said "This is how it is done". Тогда фактические данные должны выглядеть как "He said \"This is how it is done\".".

Это гарантирует, что \" обрабатывается как "(Quotation mark), а не как форматирование JSON. Это называется escape character.

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

Попробуйте это

$arr = ['This is a sample','This is also a "sample"']; echo json_encode($arr);

ВЫВОД:

["This is a sample","This is also a \"sample\""]
 2
Author: Mayank, 2016-03-16 06:34:01

У меня была очень похожая проблема, у меня был массив, готовый к публикации. в моей почтовой функции у меня было следующее:

json = JSON.stringfy(json);

Деталь здесь в том, что я использую blade внутри laravel для создания формы с тремя представлениями, чтобы я мог переходить назад и вперед, у меня есть между каждой проверкой кнопок назад и вперед, и когда я возвращаюсь в форму без перезагрузки страницы, мой json заполняется обратными косыми чертами. Я console.log(json) при каждой проверке и понял, что json обрабатывался как строка, а не как объект.

В заключение я не должен был проверять json = JSON.stringfy(json) вместо этого я назначил его другой переменной.

var aux = JSON.stringfy(json);

Таким образом, я сохраняю json как объект, а не как строку.

 0
Author: Jesus Walker, 2017-05-29 22:01:59

json_encode всегда будет добавлять косые черты.

Проверьте некоторые примеры в руководстве ЗДЕСЬ

Это потому, что если есть какие-то символы, которые нужно экранировать, то они создадут проблему.

Чтобы использовать json, пожалуйста, проанализируйте свой json, чтобы убедиться, что косые черты удалены

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

<?php
$array = array('url'=>'http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg','id'=>54);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
var x = jQuery.parseJSON('<?php echo json_encode($array);?>');
alert(x);
</script>

Это мой код, и я могу разобрать JSON.

Проверьте свой код Может быть, вы что-то упускаете при разборе JSON

 -3
Author: Vipin Jain, 2012-04-25 12:02:04