2012-03-19 14 views
19

Sto eseguendo il debug di questo ajax per un bel po 'di tempo. Ho questo sul mio file jQuery:json_encode non funziona con una stringa html come valore

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

Questo chiama service.php, e al suo interno ho questo:

$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)); 

Questo non funziona. Sostituendo lo $str con lo $str = "HELLO WORLD";, jQuery avvisa cosa devo aspettarmi. Quello che sembra essere il problema?

EDIT:

Ecco uno screenie dell'uscita:

enter image description here

Lo fa avvisi, ma se modifico il mio jQuery in questo:

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

Poi lo fa Niente affatto, persino allarmante.

ho fatto un var_dump sul json_encode e qui è la discarica, sembra un JSON malformata:

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> 

Ecco il contenuto pieno di 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

tuo JSON sembra .. .? –

+0

di "non funziona" vuoi dire che sta generando errori? O non inserisce l'HTML o ..? –

+0

Come funziona "non funziona"? A JSON non può importare di meno COSA si sta incorporando nella stringa: può essere numeri, può essere testo, può essere html. non importa, a patto che le regole di sintassi JSON siano rispettate. –

risposta

0

E ' sembra che tu debba sfuggire alle tue quotazioni lato server. Dato che sono lì, sembra che stia creando una stringa JSON non valida.

+0

Proprio quello che sospetto, ma non riesco a trovare quale sia la corretta escaping dovrei fare in '$ str' –

+0

se vuoi scappare manualmente, puoi cambiare a questo $ str = "

Nachricht empfangen!
"; – davehale23

3

Alcune cose da provare:

ajaxForm supporta argomento dataType, se vi aspettate un JSON proveniente dal server, utilizzare dataType: json in questo modo

$("#typeForm").ajaxForm({ 
    success : function(html){ 
     // html here is already automatically a json object 
     alert(html.prompt); 
    }, 
    dataType: 'json' 
}).submit(); 

Potresti postare il pieno service.php? O provare quanto segue:

uscita (json_encode (array ('nome_file' => $ data [ 'upload_data'] [ 'nome_file'], 'prompt' => $ str)));

- EDIT -

Non certo perché i rendimenti json_encode così strana stringa: s, è il json_encode una libreria PHP standard o una libreria esterna? Sto chiedendo questo perché alcuni server non hanno json_encode nella loro installazione php ... ho provato sulla mia json_encode interno php locale e utilizzando e funziona benissimo:

<?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

Grazie per questo, ma non funziona. Se l'ho fatto, allora non sarà affatto allerta. –

+0

Hai una pagina di prova su questo? Più facile se potessi passare e testare direttamente –

+0

e sì non avviserà come dataType json si aspetterebbe una stringa json valida, nel qual caso "HELLO WORLD" non è un jono valido –

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> 

Questo sembra essere rotto perché non c'è nessuna citazione in fuga. Quando viene trovato un "senza escape", interrompe la struttura JSON che ti aspetti Escaped "dovrebbe essere \", virgolette singole con \ "e così via.

0

Se non è possibile trovare una soluzione migliore per questo è possibile codificare il valore di codifica 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)); 

e nel client decodificarlo, IMO questo è più sicuro questo è anche più applicabile se si è l'elaborazione di caratteri da diverse lingue.

ANCHE:

per assicurarsi che verranno aggiunti altri personaggi sulla stringa chiamata JSON uscita; writer dopo averlo stampato.

+0

Questo tipo di lavoro funziona, ma come lo decodificare in jQuery? –

+0

per chrome o mozilla puoi usare atob() o btoa() – jerjer

+0

per altri browser puoi usare questa libreria js http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html o questo http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript – jerjer

66

Ho avuto lo stesso problema con json_encode oggi. Ma dopo aver testato un sacco ho trovato la soluzione giusta:

in php per codificare l'array o stringa:

PHP: json_encode(ARRAY, JSON_HEX_QUOT | JSON_HEX_TAG); 

in javascript per decodificare la stessa:

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

Sorprendente risposta! Questo è il modo di farlo. –

+0

Stavo avendo lo stesso problema ma ero quasi alla soluzione. Stavo usando 'json_encode ($ json, JSON_HEX_QUOT | JSON_HEX_APOS)'. Cambiare il 'JSON_HEX_APOS' in' JSON_HEX_TAG' ha fatto sparire i miei problemi! – RedYetiCo

+2

Questo dovrebbe essere contrassegnato come la risposta corretta. – Robert

Problemi correlati