web-dev-qa-db-fra.com

json_encode ne fonctionne pas avec une chaîne HTML comme valeur

Je débogue cet ajax depuis un bon moment maintenant. J'ai ceci sur mon fichier jQuery:

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

Cela appelle service.php , et dans celui-ci, j'ai ceci:

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

Cela ne marchera pas. Mais en remplaçant $str par $str = "HELLO WORLD"; les alertes jQuery, à quoi devrais-je m'attendre? Quel semble être le problème?

MODIFIER:

Voici un screenie de la sortie:

enter image description here

Il fait des alertes, mais si je modifie mon jQuery dans ceci:

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

Ensuite, il ne fait rien du tout, même en alerte.

J'ai fait un var_dump sur le json_encode et voici le dump, il ressemble à un JSON mal formé:

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>

Voici le contenu complet de 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)));
        }
    }
}
23
planet x

J'avais le même problème avec json_encode aujourd'hui. Mais après avoir beaucoup testé, j'ai trouvé la bonne solution:

Dans PHP pour encoder le tableau ou la chaîne:

json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);

En JS pour décoder le même:

var d = $.parseJSON(content);
83
asachanfbd

Quelques trucs à essayer:

ajaxForm supporte l'argument dataType, si vous attendez un JSON provenant du serveur, utilisez dataType: json comme suit

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

Pourriez-vous publier le service complet.php? OR essayez ce qui suit:

exit (json_encode (array ('nom_fichier' => $ data ['upload_data'] [nom_fichier ']],' Prompt '=> $ str)));

-- MODIFIER --

Vous ne savez pas pourquoi json_encode renvoie une chaîne aussi étrange: s, le json_encode est-il une bibliothèque php standard ou une bibliothèque externe? Je demande ceci parce que certains serveurs n'ont pas json_encode dans leur installation php ... J'ai testé sur mon local et en utilisant php interne json_encode et cela fonctionne très bien:

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

Si vous ne trouvez pas de meilleure solution pour cela, vous pouvez encoder la valeur en encodage 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));

et dans le client le décoder, IMO c'est plus sûr c'est aussi plus applicable si vous traitez des caractères de différentes langues.

ÉGALEMENT:

pour être sûr qu'aucun autre caractère ne sera ajouté à l'appel de chaîne json exit; écrivain après l’avoir imprimé.

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>

Cela semble être cassé parce qu'aucune citation ne s'échappe. Quand un "non échappé" est trouvé, la structure JSON que vous attendez est cassée. ".

0
AlfredoVR

Que diriez-vous de convertir tous les caractères problématiques potentiels au lieu de ce qui résout le problème dans ces circonstances:

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

0
Andrew

Il semble que vous ayez besoin d'échapper à vos citations côté serveur. Comme ils sont là, il semble créer une chaîne JSON non valide.

0
davehale23