Intereting Posts

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

Я давно использую 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 добавляет косые черты?

Обновить

@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-скрипт:

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

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

Символы с обратной косой чертой могут вызывать проблемы (когда предшествует a < он запускает правила SGML для «конца элемента скрипта») при встраивании в элемент HTML-скрипта. Их избегают в качестве меры предосторожности.

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

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

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

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

 json_encode($array,JSON_UNESCAPED_SLASHES); 

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

Я просто столкнулся с этой проблемой и в некоторых моих сценариях, и это, казалось, происходит, потому что я применял 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"}] 

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

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

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

 json = JSON.stringfy(json); 

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

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

 var aux = JSON.stringfy(json); 

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

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