Как избежать обратной косой черты в JSON возвращается из PHP?

У меня возникли проблемы с кодом ниже. журнал консоли возвращает:

"returningList{"view":0,"new":1,"random":1} result: "{\"view\":0,\"new\":1,\"random\":1}""

Как вы можете видеть, он приобретает обратную косую черту, что делает его больше не JSON, несмотря на указание datatype : 'json',

Кажется, проблема возникает, когда результат читается обратно из PHP в JavaScript, потому что если я пишу $jsonArr в MySQL перед его отображением, тогда данные SQL показывают правильную строку (т.е. без обратной косой черты).

Пожалуйста, помогите, потому что это очевидное безумие действительно заводит меня. Все, что я хочу сделать, это вернуть мои данные — в моем реальном коде я обычно не возвращаю JSON, который я передал в качестве данных, но здесь достаточно доказать это. Я думал, что 'json' Тип данных будет означать, что он будет принимать отраженный JSON, не повреждая его.

Извиняюсь за следующую тупость, но в ответ на подобные вопросы я видел, как люди просто говорят «это выходит из кавычек», как будто это отвечает на вопрос — в данном случае, по крайней мере, кажется, что это не так: Очевидно (AFAIK ) вот откуда берутся обратные слэши, но кавычки являются частью синтаксиса JSON (который он знает, что он ожидает), а не частью содержимого поля, поэтому их явно не следует экранировать. мне нужно решение Пожалуйста. Благодарю.

window.newGot = listBuild({
'view' : 0,
'new' : 1,
'random' : 1
});

function listBuild(options)
//Fill the new list.
return $.ajax({
type : "POST",
url : "./php/getList.php",
cache : false,
data : {
options : JSON.stringify(options)
},
datatype : "json"}).then(function(jsonList) {
console.log('returningList' + JSON.stringify(options) + ' result: ' + JSON.stringify(jsonList));
return jsonList;
});
}

Вот содержимое файла php:

<?php
$options = json_decode($_POST['options'], true);
$jsonArr = json_encode($options);
echo $jsonArr;

0

Решение

Что бы ни генерировало JSON, это, вероятно, двойное кодирование, например

$arr = array();
foreach($data as $foo) {
$arr[] = json_encode($foo);
}
echo json_encode($arr);

JSON-кодирование должно быть самым последним выполненным шагом, перед тем, как произойдет вывод на клиент.

например

$foo = 'This is a string';
$foo_step1 = json_encode($foo); // "This is a string"$foo_step2 = json_encode($foo_step1); // "\"This is a string\""
1

Другие решения

В зависимости от того, где проблема, это может быть связано с тем, что вы используете json.stringify, пытались ли вы вместо этого проанализировать его как json?

Jquery имеет следующее, если вы включаете библиотеку jquery, в противном случае она есть и в браузере:
$ .ParseJSON ()

http://api.jquery.com/jquery.parsejson/

Другие проблемы могут быть в том, что вы используете двойное кодирование

Также запустите его через валидатор, который не является допустимым кодом

http://jsonlint.com/

«returningList {» view «: 0,» new «: 1,» random «: 1} result:» {\ «view \»: 0, \ «new \»: 1, \ «random \»: 1} » «

Это то, что я ожидаю, что JSON будет выглядеть

{
"returningList": {
"view": 0,
"new": 1,
"random": 1
},
"result": {
"view": 0,
"new": 1,
"random": 1
}

}

0

По-видимому jsonList является строкой JSON, а не декодированным объектом, который он представляет. Поэтому, когда вы звоните JSON.stringify() на нем вы перекодируете строку.

Когда вы указываете dataType: 'json'jQuery должен автоматически декодировать ответ. Я знаю, что это происходит, когда вы указываете обратный вызов в success: вариант, но, похоже, он этого не делает, когда вы используете .then(), Попробуйте использовать .done() вместо.

С учетом сказанного я попытался воспроизвести ваш результат в jsfiddle, но не смог.

http://jsfiddle.net/barmar/53jthkyu/4/

0
По вопросам рекламы [email protected]