Я использую PHP json_encode()
для возврата некоторых данных, полученных с помощью jQuery ajax()
:
Упрощенный JS:
$.ajax({ dataType: 'json', contentType: 'application/json', cache: false, type: 'POST', url: './api/_imgdown.php', error: function(jqXHR, textStatus, errorThrow) { console.log(jqXHR, textStatus, errorThrow); }, success: function(data, textStatus, jqXHR) { console.log(data, textStatus, jqXHR); } });
PHP:
header('Content-Type: application/json; charset=UTF-8'); //default apiResponse $apiResponse = [ "status" => 1, "message" => "success", "data" => null ];
Затем, когда php запускает мой код, он заканчивается добавлением этих данных:
$apiResponse['data'][] = [ "mid" => (int)$mid, "card_type" => $card_type, "header_size" => (int)$headers['Content-Length'], "saved_size" => (int)filesize($imgSavePath), "saved_path" => $imgSavePath ]; //spit out the JSON echo json_encode($apiResponse); exit();
JSON:
{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]}
Сначала это кажется правильным. Мой Ajax, который извлекает этот PHP, всегда заканчивается parseerror
(таким образом, он входит в часть error
ajax()
).
Если вы скопируете и вставьте этот JSON на http://jsonlint.com/ , он говорит, что «Неожиданный токен» и http://jsonformatter.curiousconcept.com/ недействительны.
Я пробовал echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES);
даже несмотря на то, что сбрасывание косой черты в порядке \/
но не имеет никакого значения.
Но что не совсем верно? Разве PHP не должен был возвращать действительный JSON?
Дополнительная информация: тестирование на Windows7, Chrome v28.XX, использование PHP 5.4.XX на Apache
Вопросы, которые я прочитал, прежде чем отправлять это сообщение:
Обновить:
Копирование из SO в JSONlint дает действительный json. Поэтому я немного исследовал и заметил, что PHP создает странный скрытый символ, который фактически делает json недействительным. См. Снимок экрана ниже. Как я это исправим?
Это может быть проблема с меткой спецификации. Попробуйте сохранить файл как обычно UTF-8.
Я столкнулся с одной и той же проблемой, но не смог найти, какой файл на моей Windows был сохранен в UTF8 с помощью спецификации (хотя я пытался найти файлы столько, сколько мог).
Однако я обнаружил обходной путь. Предполагая, что на стороне сервера у меня есть
die(json_encode(array( 'OK' => 1 )))
success: function (response) { var data = $.parseJSON(response); console.log(data.OK); // = 1 }
var dataOK = response ['OK']; // = 1