Json_encode не работает с строкой html как значение
Я отлаживаю этот аякс довольно долгое время. У меня это в файле jquery:
$("#typeForm").ajaxForm({
success : function(html){
alert(html);
}).submit();
Это вызывает service.php, и внутри него у меня есть это:
$data = array('upload_data' => $this->upload->data());
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));
Это не сработает. Но, заменив $str
на $str = "HELLO WORLD";
, jQuery предупреждает, что я должен ожидать. Какая проблема?
EDIT:
Вот пример вывода:
![enter image description here]()
Он предупреждает, но если я изменю свой jQuery на это:
$("#typeForm").ajaxForm({
success : function(html){
var obj = $.parseJSON(html);
alert(obj);
}).submit();
Тогда он ничего не делает, даже предупреждая.
Я сделал var_dump на json_encode
, и вот дамп, он выглядит как неправильный JSON:
string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!<\/span><\/div>"}"
</span></div>
Вот полный контент service.php
class Service extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$filename = 'uploadfile';
$config['upload_path'] = './uploads/temp';
$config['allowed_types'] = 'jpg|png|gif|doc|docx|pdf|ppt|pptx|xls|xlsx|bmp';
$config['max_size'] = '3072';
$config['encrypt_name'] = TRUE;
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload($filename))
{
$error = array('error' => $this->upload->display_errors());
echo json_encode(array('error' => $error['error']));
}
else
{
$data = array('upload_data' => $this->upload->data());
$file_name = $data['upload_data']['file_name'];
//print_r($data);
//echo json_encode(array('test' => "Hello World"));
$str = "<div style='position:relative;'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
$str2 = json_encode(array("file_name" => $file_name, "prompt" => $str));
//var_dump($str2);
exit(json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str)));
}
}
}
Ответы
Ответ 1
У меня была такая же проблема с json_encode
сегодня. Но после тестирования много я нашел правильное решение:
В php для кодирования массива или строки:
PHP: json_encode(ARRAY, JSON_HEX_QUOT | JSON_HEX_TAG);
В javascript для декодирования то же самое:
JS: var d = $.parseJSON(content);
Ответ 2
Некоторые вещи, которые нужно попробовать:
ajaxForm поддерживает аргумент dataType, если вы ожидаете, что JSON поступает с сервера, используйте dataType: json
так
$("#typeForm").ajaxForm({
success : function(html){
// html here is already automatically a json object
alert(html.prompt);
},
dataType: 'json'
}).submit();
Не могли бы вы разместить полный service.php? ИЛИ попробуйте следующее:
exit (json_encode (array ('file_name' = > $ data ['upload_data'] ['file_name'], 'prompt' = > $str)));
- EDIT -
Не уверен, почему json_encode возвращает такую странную строку: s, это json_encode
стандартная библиотека php или внешняя библиотека? Я спрашиваю об этом, потому что на некоторых серверах нет json_encode в их установке php... Я тестировал на своем локальном компьютере и использовал php internal json_encode, и он отлично работает:
<?php
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('prompt' => $str));
// output
//{"prompt":"<div style='position:relative'><img src='\/assets\/ui\/success.png' \/><span style='position:relative;top:-15px;'>Nachricht empfangen!<\/span><\/div>"}
Ответ 3
Похоже, вам нужно избегать ваших котировок на стороне сервера. Поскольку они находятся там, похоже, создается некорректная строка JSON.
Ответ 4
string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!<\/span><\/div>"}"
</span></div>
Это, кажется, сломано, потому что нет цитаты. Когда найден неизолированный ", он разбивает структуру JSON, которую вы ожидаете.
Выключено "должно быть", одинарные кавычки с\и т.д.
Ответ 5
Если вы не можете найти лучшее решение для этого, вы можете закодировать значение для кодировки base64:
$data = array('upload_data' => $this->upload->data());
$str = base64_encode("<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>");
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));
а в клиенте декодирует его, IMO это более безопасно, это также более применимо, если вы обрабатываете символы с разных языков.
и
чтобы убедиться, что никакие другие символы не будут добавлены в json string вызов exit; после его печати.