json_encode不使用html字符串作为值

我现在正在调试这个ajax很长一段时间。 我在我的jQUery文件中有这个:

$("#typeForm").ajaxForm({ success : function(html){ alert(html); }).submit(); 

这会调用service.php ,在其中我有这个:

 $data = array('upload_data' => $this->upload->data()); $str = "
Nachricht empfangen!
"; echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));

这不行。 但是将$str替换$str $str = "HELLO WORLD"; jQuery警告我应该期待什么。 什么似乎是问题?

编辑:

这是输出的屏幕:

在此处输入图像描述

它会发出警报,但如果我将jQuery修改为:

 $("#typeForm").ajaxForm({ success : function(html){ var obj = $.parseJSON(html); alert(obj); }).submit(); 

然后它什么都不做,甚至提醒。

我在json_encode上做了一个var_dump,这里是转储,它看起来像一个格式错误的JSON:

 string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"
Nachricht empfangen!<\/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 = "
Nachricht empfangen!
"; $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参数,如果你期望来自服务器的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库还是外部库? 我问这个是因为有些服务器在他们的php安装中没有json_encode …我在我的本地测试并使用php内部json_encode它工作正常:

 Nachricht empfangen!
"; echo json_encode(array('prompt' => $str)); // output //{"prompt":"
Nachricht empfangen!<\/span><\/div>"}

如果找不到更好的解决方案,可以将值编码为base64编码:

 $data = array('upload_data' => $this->upload->data()); $str = base64_encode("
Nachricht empfangen!
"); echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'prompt' => $str));

并且在客户端解码它,IMO这更安全,如果您正在处理来自不同语言的字符,这也更适用。

也:

确保在json字符串调用exit上不会添加其他字符; 作家打印后。

看起来你需要逃避服务器端的报价。 由于它们在那里,它似乎创建了一个无效的JSON字符串。

 string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","prompt":"
Nachricht empfangen!<\/span><\/div>"}"

这似乎被打破了,因为没有引用逃脱。 当找到一个未转义的“,它会破坏你期望的JSON结构。转义”应该是\“,单引号带\’等等。