У меня возникли проблемы с кодом ниже. журнал консоли возвращает:
"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;
Что бы ни генерировало 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\""
В зависимости от того, где проблема, это может быть связано с тем, что вы используете json.stringify, пытались ли вы вместо этого проанализировать его как json?
Jquery имеет следующее, если вы включаете библиотеку jquery, в противном случае она есть и в браузере:
$ .ParseJSON ()
http://api.jquery.com/jquery.parsejson/
Другие проблемы могут быть в том, что вы используете двойное кодирование
Также запустите его через валидатор, который не является допустимым кодом
«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
}
}
По-видимому jsonList
является строкой JSON, а не декодированным объектом, который он представляет. Поэтому, когда вы звоните JSON.stringify()
на нем вы перекодируете строку.
Когда вы указываете dataType: 'json'
jQuery должен автоматически декодировать ответ. Я знаю, что это происходит, когда вы указываете обратный вызов в success:
вариант, но, похоже, он этого не делает, когда вы используете .then()
, Попробуйте использовать .done()
вместо.
С учетом сказанного я попытался воспроизвести ваш результат в jsfiddle, но не смог.