Подтвердить что ты не робот

Почему json_encode добавляет обратную косую черту?

Я использовал json_encode в течение длительного времени, и до сих пор у меня не было никаких проблем. Теперь я работаю с загрузкой script, и я пытаюсь вернуть некоторые данные 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 добавляет косые черты?

обновление

@Quentin сказал, что что-то происходит между 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 script:

  uploader.bind('FileUploaded', function(up, file, data) {
    alert(data.toSource());
    $('#' + file.id + " b").html("100%");
  });
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

json_encode($array,JSON_UNESCAPED_SLASHES);

Ответ 3

Я добавлю это здесь, потому что еще не могу прокомментировать.

Я просто столкнулся с этой проблемой в некоторых моих сценариях, и это, казалось, происходит, потому что я применял json_encode к массиву, заключенному в другой массив, который также был закодирован json. Это легко сделать, если у вас есть несколько циклов foreach в script, которые создают данные. Всегда используйте 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"}]

Надеюсь, это поможет кому-то!

Ответ 4

Это происходит потому, что формат 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\""]

Ответ 5

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

json = JSON.stringfy(json);

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

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

var aux = JSON.stringfy(json);

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

Ответ 6

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

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

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

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

Хорошо, удаляете ли вы slashesthe 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.