web-dev-qa-db-ja.com

json_encodeが値としてhtml文字列を使用していない

私はかなり長い間このajaxをデバッグしています。私は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は何を期待すべきかを警告します。問題に見えるのは?

編集:

出力のスクリーニーは次のとおりです。

enter image description here

アラートを出しますが、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":"<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)));
        }
    }
}
26
planet x

今日、json_encodeで同じ問題が発生していました。しかし、多くをテストした後、私は正しい解決策を見つけました:

PHPで配列または文字列をエンコードするには:

json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);

JSで同じものをデコードするには:

var d = $.parseJSON(content);
89
Abhishek Sachan

試すべきもの:

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以下を試してください:

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を使用してテストし、正常に動作します。

<?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>"}
3
Andreas Wong

この状況で問題を修正するものだけでなく、潜在的な問題のあるすべての文字を変換してください:

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

1
Andrew

これに対するより良い解決策が見つからない場合は、値を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文字列呼び出しで他の文字が追加されないことを確認するexit; writerを印刷した後。

1
jerjer
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
AlfredoVR

引用符をサーバー側でエスケープする必要があるようです。そこにあるので、無効なJSON文字列を作成しているようです。

0
davehale23

配列のPromptオブジェクトだけを呼び出す必要はありません!以下のように:

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