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 предупреждает, что я должен ожидать. В чем проблема?

РЕДАКТИРОВАТЬ:

Вот пример выхода:

введите описание изображения здесь

Он предупреждает, но если я изменю свой 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!&lt;\/span&gt;&lt;\/div&gt;"}" </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))); } } } 

У меня была такая же проблема с json_encode сегодня. Но после тестирования много я нашел правильное решение:

В php для кодирования массива или строки:

 PHP: json_encode(ARRAY, JSON_HEX_QUOT | JSON_HEX_TAG); 

В javascript для декодирования то же самое:

 JS: var d = $.parseJSON(content); 

Некоторые вещи, чтобы попробовать:

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)));

— РЕДАКТИРОВАТЬ —

Не знаете, почему 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>"} 

Похоже, вам нужно избегать ваших котировок на стороне сервера. Поскольку они находятся там, похоже, создается некорректная строка 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!&lt;\/span&gt;&lt;\/div&gt;"}" </span></div> 

Кажется, это сломано, потому что нет никакой цитаты. Когда найден неизолированный ", он разбивает структуру JSON, которую вы ожидаете. С экранированным« должно быть », одинарные кавычки с \» и т. Д.

Если вы не можете найти лучшее решение для этого, вы можете кодировать значение для кодировки 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 call exit; после того, как вы напечатаете его.