2012-03-19 109 views
19

我正在调试这个ajax很长一段时间了。我有这个在我的jQuery的文件:json_encode不能使用html字符串作为值

$("#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会发出警告我应该做什么。什么似乎是问题?

编辑:

下面是输出的的screenie:

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!&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))); 
     } 
    } 
} 
+0

您的JSON的样子.. 。? – 2012-03-19 03:21:32

+0

作者:“不会工作”你的意思是这是抛出错误?或者它不注入HTML或..? – 2012-03-19 03:22:22

+0

它不起作用? JSON并不在乎你在字符串中嵌入的内容 - 它可以是数字,也可以是文本,也可以是html。无关紧要,只要JSON语法规则得到遵守。 – 2012-03-19 03:22:25

回答

0

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

+0

正是我所怀疑的,但我似乎无法找到什么是正确的转义,我应该在'$ str' – 2012-03-19 03:30:50

+0

如果你想手动转义这个,你可以改成这个 $ str =“

Nachricht empfangen!
”; – davehale23 2012-03-19 14:42:34

3

一些东西去尝试:

给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? OR尝试以下方法:

出口(json_encode(阵列( 'FILE_NAME'=> $数据[ 'upload_data'] [ 'FILE_NAME'], '提示'=> $ STR)));

- 编辑 -

不知道为什么json_encode回报这种怪异的字符串:S,是json_encode一个标准的PHP库或外部库?我问这是因为某些服务器没有json_encode在PHP时......我测试了我的本地和使用PHP内部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>"} 
+0

感谢这一点,但没有它不起作用。如果我这样做了,那么它根本不会提醒。 – 2012-03-19 03:36:14

+0

你有这个测试页吗?更容易,如果我可以通过和直接测试 – 2012-03-19 03:37:50

+0

和是的,它不会提示dataType JSON会期望一个有效的JSON字符串,在这种情况下,“HELLO WORLD”不是有效的JSON – 2012-03-19 03:38:20

0
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结构。 转义的”应该是\“,单引号与\”等等。

0

如果你不能找到这更好的解决方案,您可以编码值以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这是更安全,这也是如果你更适用处理来自不同语言的字符。

ALSO:

,以确保没有其他字符将在JSON字符串调用退出加入;您打印后请写作

+0

这种有点工作,但你会如何解码它在jQuery? – 2012-03-19 05:12:54

+0

对于铬或mozilla你可以使用atob()或btoa() – jerjer 2012-03-19 05:15:49

+0

对于其他浏览器,你可以使用这个js库http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html或这个http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript – jerjer 2012-03-19 05:16:43

66

我今天的json_encode有同样的问题。但在测试了很多后,我找到了正确的解决方案:

PHP: json_encode(ARRAY, JSON_HEX_QUOT | JSON_HEX_TAG); 

在JavaScript中相同的解码:

在PHP中的数组或字符串编码

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

令人惊叹的答案!这是做到这一点的方法。 – 2013-09-19 18:31:26

+0

我遇到了同样的问题,但我几乎接近解决方案。我正在使用'json_encode($ json,JSON_HEX_QUOT | JSON_HEX_APOS)'。将'JSON_HEX_APOS'更改为'JSON_HEX_TAG'使我的问题消失了! – RedYetiCo 2014-03-08 03:46:43

+2

这应该被标记为正确的答案。 – Robert 2015-12-09 02:54:40

相关问题