json_encode, создающий искаженный JSON (с дополнительным скрытым символом)
Я использую PHP json_encode()
вернуть некоторые данные, полученные с помощью jQuery's 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
Вопросы, которые я прочитал, прежде чем опубликовать этот:
- json_encode создает искаженные данные JSON?
- /questions/42940643/obrabotka-ekranirovannyih-kosyih-chert-v-stroke-json/42940651#42940651
- о json_encode и ajax dataType: "json"
- php json_encode не возвращает правильную строку в кодировке json
Обновить:
Копирование из SO в JSONlint дает действительный json. Поэтому я немного углубился в исследование и заметил, что PHP создает странный скрытый символ, который фактически делает json недействительным. Смотрите скриншот ниже. Как мне это исправить?
2 ответа
Это может быть проблема со знаком спецификации. Попробуйте вместо этого сохранить файл как обычный UTF-8.
Я столкнулся с той же проблемой, но я не смог найти, какой файл на моей Windows сохранен в UTF8 с BOM (хотя я пытался искать файлы столько, сколько мог).
Тем не менее, я нашел обходной путь. Предполагая на стороне сервера у меня есть
die(json_encode(array(
'OK' => 1
)))
- При вызове $.ajax я удаляю запись "datatype: 'json'" и получаю доступ к ответу со следующими строками:
success: function (response) { var data = $.parseJSON(response); console.log(data.OK); // = 1 }
- При вызове $.ajax я все еще сохраняю запись "datatype: 'json'", затем мне нужно получить доступ к значению внутри ответа, как это
var dataOK = response['OK']; // = 1