it-swarm.com.ru

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

Тогда он вообще ничего не делает, даже предупреждает.

Я сделал 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!&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)));
        }
    }
}
23
planet x

У меня была та же проблема с json_encode сегодня. Но после многих испытаний я нашел правильное решение:

В PHP для кодирования массива или строки:

json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);

В JS декодировать то же самое:

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

Некоторые вещи, чтобы попробовать:

ajaxForm поддерживает аргумент dataType, если вы ожидаете JSON от сервера, используйте dataType: json, например, так

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

Не могли бы вы опубликовать полный сервис .php? OR попробуйте следующее:

выход (json_encode (массив ('file_name' => $ data ['upload_data'] ['file_name'], 'Prompt' => $ str)));

-- Правка --

Не уверен, почему json_encode возвращает такую ​​странную строку: s, json_encode это стандартная библиотека php или внешняя библиотека? Я спрашиваю об этом, потому что некоторые серверы не имеют json_encode в своей установке php ... Я проверил на своем локальном и используя внутренний jp_soncode php, и он работает нормально:

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

Если вы не можете найти лучшего решения для этого, вы можете закодировать значение в кодировку 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; Писатель после того, как вы напечатаете его.

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

Как насчет того, чтобы преобразовать все символы потенциальной проблемы, а не только то, что решает проблему в этом случае:

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

Похоже, вам нужно избегать ваших кавычек на стороне сервера. Поскольку они там, похоже, создается недопустимая строка JSON.

0
davehale23