Php json_encode不使用html字符串作为值
我调试这个ajax已经有相当一段时间了。我的jQUery文件中有以下内容:Php json_encode不使用html字符串作为值,php,jquery,ajax,json,Php,Jquery,Ajax,Json,我调试这个ajax已经有相当一段时间了。我的jQUery文件中有以下内容: $("#typeForm").ajaxForm({ success : function(html){ alert(html); }).submit(); 这将调用service.php,其中包含以下内容: $data = array('upload_data' => $this->upload->data()); $str = "<div style='position
$("#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));
然后它什么也不做,甚至发出警报
我在json\u encode
上做了一个var\u转储,下面是转储,它看起来像一个格式错误的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>
string(214)“{”文件名“:“cde5959988d38652909ce5a8fe3a6d6f.png”,“提示符“:“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 = "<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)));
}
}
}
类服务扩展CI_控制器
{
公共函数构造()
{
父项::_构造();
}
公共职能指数()
{
$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);
如果(!$this->upload->do_upload($filename))
{
$error=array('error'=>$this->upload->display_errors());
echo json_编码(数组('error'=>$error['error']);
}
其他的
{
$data=array('upload_data'=>$this->upload->data());
$file_name=$data['upload_data']['file_name'];
//打印(数据);
//echo json_编码(数组('test'=>“Hello World”);
$str=“Nachricht empfangen!”;
$str2=json_编码(数组(“文件名”=>$file_名,“提示”=>$str));
//var_dump($str2);
退出(json_编码(数组('file_name'=>$data['upload_data']['file_name'],'prompt'=>$str));
}
}
}
看起来您需要从服务器端转义引号。因为它们在那里,所以似乎创建了一个无效的JSON字符串。一些东西可以尝试:
ajaxForm支持数据类型参数,如果您希望一个JSON来自服务器,请使用dataType:JSON
像这样
$("#typeForm").ajaxForm({
success : function(html){
// html here is already automatically a json object
alert(html.prompt);
},
dataType: 'json'
}).submit();
你能发布完整的service.php吗?或者尝试以下操作:
退出(json_编码(数组('file_name'=>
$data['upload_data']['file_name'],'prompt'=>$str))
--编辑--
不确定为什么json_encode返回如此奇怪的字符串:s,json_encode
是标准php库还是外部库?我这样问是因为有些服务器在php安装中没有json_编码。。。我在我的本地服务器上进行了测试,并使用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>"}
string(214)“{”文件名“:“cde595958d38652909ce5a8fe3a6d6f.png”,“提示符“:“Nachricht emphangen!\/span\/div”}”
这似乎被打破了,因为没有引用。当发现“unescaped”时,它会破坏您期望的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));
$data=array('upload_data'=>this->upload->data());
$str=base64_编码(“Nachricht empfangen!”);
echo json_encode(数组('file_name'=>$data['upload_data']['file_name'],'prompt'=>$str));
在客户端解码中,这更安全,如果处理来自不同语言的字符,这也更适用
此外:
确保打印后不会在json字符串调用exit;writer上添加其他字符。我今天遇到了与json\u encode
相同的问题。但经过大量测试,我找到了正确的解决方案:
在PHP中对数组或字符串进行编码:
json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);
在JS中解码相同内容:
var d = $.parseJSON(content);
在这种情况下,如何转换所有潜在的问题字符,而不仅仅是解决问题的方法:
die(json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE));
您应该只调用数组的prompt
对象,而不是全部!如下所示:
$("#typeForm").ajaxForm({
success : function(html){
var obj = $.parseJSON(html);
alert(obj.prompt);
}).submit();
JSON不能很好地处理magic method\uuuuToString()
产生的字符串
输出-几乎不可能JSON\uEncode()
任何远程接触到这样的东西的东西
<?php
/**
* DEBUGGING NIGHTMARE
* SO MUCH FUN, 10/10,
*/
class Nightmare {
protected $str;
public function __construct($str) {
$this->str = $str;
}
public function __toString() {
return $this->str;
}
}
$test = new Nightmare('Hello Friends.');
echo $test;
> Hello Friends.
// cooool, so let's JSON the hell out of it, EASY
echo json_encode(['our_hello' => $test]);
// This what you expect to get, right?
> {"our_hello":"Hello Friends."}
// HAHA NO!!!
// THIS IS WHAT YOU GET:
> {"our_hello":{}}
// and this is why is that:
var_dump($test);
object(Nightmare)#1 (1) {
["str":protected]=>
string(14) "Hello Friends."
}
print_r($test);
Nightmare Object
(
[str:protected] => Hello Friends.
)
您的JSON看起来像…?by“不起作用“你的意思是这是投掷错误吗?或者它没有注入HTML或..?它如何“不工作”?JSON不在乎你在字符串中嵌入了什么——它可以是数字,可以是文本,也可以是html。没关系,只要遵守JSON语法规则就行。伙计们,看我编辑的帖子。很抱歉没有发布输出。所以它会提醒?请确切说明问题所在和/或预期行为。。。到目前为止,您的问题非常模糊。这正是我所怀疑的,但我似乎找不到在$str
中我应该做的正确转义。如果您想手动转义,您可以更改为$str=“Nachricht empfangen!”;谢谢你,但是不行。如果我这样做了,它就不会发出警报。你有测试页面吗?如果我可以直接进行测试,它将不会发出警报,因为数据类型json需要一个有效的json字符串,在这种情况下,“HELLO WORLD”不是一个有效的JSonTanks,但我没有测试页面。这是以我的本地电影为背景的。我想这与格式错误的JSON有关,因为如果我转储JSON编码,它看起来像格式错误的JSON。如果您使用chrome浏览器,请按F12并查看右下角,如果您看到类似于(x)1
,它可能会告诉您。json_encode应该正确地转义您的HTML,所以不要太担心对于chrome或mozilla,您可以对其他浏览器使用atob()或btoa(),您可以使用这个js库,或者这是一个好主意,在php端使用base64编码,在js端使用base64解码。我真的更喜欢这种方法,因为您不必弄乱任何json_encode标志!惊人的答案!这就是解决问题的方法。我也有同样的问题,但我几乎找到了解决办法。我使用的是json编码($json,json'u HEX'u QUOT)json_
$("#typeForm").ajaxForm({
success : function(html){
var obj = $.parseJSON(html);
alert(obj.prompt);
}).submit();
<?php
/**
* DEBUGGING NIGHTMARE
* SO MUCH FUN, 10/10,
*/
class Nightmare {
protected $str;
public function __construct($str) {
$this->str = $str;
}
public function __toString() {
return $this->str;
}
}
$test = new Nightmare('Hello Friends.');
echo $test;
> Hello Friends.
// cooool, so let's JSON the hell out of it, EASY
echo json_encode(['our_hello' => $test]);
// This what you expect to get, right?
> {"our_hello":"Hello Friends."}
// HAHA NO!!!
// THIS IS WHAT YOU GET:
> {"our_hello":{}}
// and this is why is that:
var_dump($test);
object(Nightmare)#1 (1) {
["str":protected]=>
string(14) "Hello Friends."
}
print_r($test);
Nightmare Object
(
[str:protected] => Hello Friends.
)