html 문자열을 값으로 사용할 수 없습니다.
나는 지금 꽤 오랫동안 이 아약스를 디버깅하고 있다.jQUERY 파일에 다음과 같은 내용이 있습니다.
$("#typeForm").ajaxForm({
success : function(html){
alert(html);
}).submit();
이것은 서비스를 호출합니다.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!<\/span><\/div>"}"
</span></div>
다음은 서비스 내용입니다.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:
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));
http://php.net/manual/en/function.json-encode.php
http://php.net/manual/en/json.constants.php
이에 적합한 솔루션을 찾을 수 없는 경우 값을 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 문자열 콜 종료에 다른 문자가 추가되지 않도록 합니다.인쇄 후 기입합니다.
몇 가지 시도해 볼 수:
ajaxForm은 dataType 인수를 지원합니다.서버에서 JSON이 전송될 것으로 예상되는 경우 를 사용합니다.dataType: json
그렇게
$("#typeForm").ajaxForm({
success : function(html){
// html here is already automatically a json object
alert(html.prompt);
},
dataType: 'json'
}).submit();
전체 서비스를 게시해 주시겠습니까?또는 다음을 시도합니다.
exit(json_syslog(array_syslogfile_name' => $data['syslog_data']['file_name'], 'syslog' => $str));
--편집 --
json_encode가 이러한 이상한 문자열 :s를 반환하는 이유는 확실하지 않습니다.json_encode
표준 php 라이브러리 또는 외부 라이브러리?php 설치에 json_encode가 없는 서버도 있기 때문에 물어봅니다.로컬에서 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!<\/span><\/div>"}"
</span></div>
빠져나갈 견적이 없어 고장난 것 같습니다.이스케이프되지 않은 "가 발견되면 예상한 JSON 구조가 깨집니다.이스케이프 "는 \, 작은따옴표는 \'로 묶어야 합니다.
는 '아예'로만 .prompt
어레이의 오브젝트 전부가 아닙니다.음음음같 뭇매하다
$("#typeForm").ajaxForm({
success : function(html){
var obj = $.parseJSON(html);
alert(obj.prompt);
}).submit();
은 JSON과 잘 않습니다.string
메서드에서 __toString()
에 가깝습니다. - 불가능에 가깝습니다.json_encode()
이런 거에 조금이라도 닿을 수 있는 건 뭐든지요
<?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.
)
언급URL : https://stackoverflow.com/questions/9764598/json-encode-not-working-with-a-html-string-as-value
'source' 카테고리의 다른 글
워드프레스로 이미지 캡션을 가져오는 기능이 있나요? (0) | 2023.03.13 |
---|---|
Wordpress 관리자 URL 변경 (0) | 2023.03.13 |
큰 각도JS 응용 프로그램 설계 (0) | 2023.03.13 |
map Dispatch To Props란? (0) | 2023.03.13 |
(노드:3341) 폐지 경고: Mongoose: mpromise (0) | 2023.03.13 |