json_decode() не работает

#php #json #ajax #syntax

#php #json #ajax #синтаксис

Вопрос:

Я использую ajax для отправки данных с помощью JSON, и он продолжает возвращать значение null. Вот строка, которую я отправляю:

 {"username":"HittmanA","code":"`1234567890-=~!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL"zxcvbnm,/ZXCVBNM?","name":"Untitled-1"}
 

Он отправляется через post. Вот код, с которым я его отправляю:

        function slash(strr){
                            var re = /([^a-zA-Z0-9])/g; 
                            var str = strr;
                            var subst = '$1'; 
                            var st = encodeURIComponent(str.replace(re,subst));
                            console.log("st");
                            return st;
                           }
          function create() {
            var info = {};
            var code=editor.getValue();
            info.username=username;
            info.code=slash(code);
            var name=document.getElementById('projectName').value;
            name2=name;
            info.name=slash(name2);
            info=JSON.stringify(info);
            console.log(info);
            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
              if (xhttp.readyState == 4 amp;amp; xhttp.status == 200) {
                document.getElementById("demo").innerHTML = xhttp.responseText;
              }
            };
            xhttp.open("POST", "create_project.php", true);
            xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhttp.send("info=" info);
          }
 

Когда он поступает в php-файл, он обрабатывается следующим образом:

     $info = $_POST['info'];
    echo "<pre>".$info."</pre>";
    //$info = urldecode($info);
    $info = json_decode($info);
    echo "<pre>".$info."</pre>";
 

Однако по какой-то причине json_decode() выполняет работу. Опять же, вот JSON, который я отправляю:

 {"username":"HittmanA","code":"`1234567890-=~!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL"zxcvbnm,/ZXCVBNM?","name":"Untitled-1"}
 

первое echo работает корректно, а второе — нет. Как мне это исправить?

Ответ №1:

json_decode() должно быть, выдает ошибку, которую вы не проверяете. Функции, подобные json_decode() и json_encode() не отображающие ошибки, вы должны использовать json_last_error , и начиная с PHP 5.5, также есть json_last_error_msg() .

 <?php

$str = '{"username":"HittmanA","code":"`1234567890-=~!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL"zxcvbnm,/ZXCVBNM?","name":"Untitled-1"}';

var_dump($str);
var_dump(json_decode($str));
var_dump(json_last_error());
var_dump(json_last_error_msg());
 

Вышеуказанные результаты:

 string(189) "{"username":"HittmanA","code":"%601234567890-%3D~!%40%23%24%25%5E%26*()_%2Bqwertyuiop%5B%5D%5CQWERTYUIOP%7B%7D%7Casdfghjkl%3B'ASDFGHJKL"zxcvbnm,/ZXCVBNM?","name":"Untitled-1"}"
class stdClass#1 (3) {
  public $username =>
  string(8) "HittmanA"
  public $code =>
  string(136) "`1234567890-=~!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL"zxcvbnm,/ZXCVBNM?"
  public $name =>
  string(10) "Untitled-1"
}
int(0)
string(8) "No error"
 

Если мы попытаемся декодировать недопустимый JSON:

 <?php

$str = 'foobar{';

var_dump($str);
var_dump(json_decode($str));
var_dump(json_last_error());
var_dump(json_last_error_msg());
 

Приведенный выше выводит:

 string(7) "foobar{"
NULL
int(4)
string(16) "boolean expected"
 

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

Комментарии:

1. Хммм, тогда почему мой son_decode() не работает? Возвращает значение NULL

2. Вам нужно будет отладить его, начиная с простейшего случая (используйте жестко заданные известные значения), например, когда вы заменяете $info = $_POST['info']; as $info = '{"username":"HittmanA"}'; , это работает? Да? Тогда, что, если со стороны клиента вместо xhttp.send("info=" info); вас попытаться отправить это жестко закодированное значение через xhttp.send() , оно все еще работает? Затем продолжайте отладку в обратном направлении, чтобы найти ошибку.

Ответ №2:

здравствуйте, мистер, если вы echo в php равно return или print в каком-либо функциональном программировании. если вы используете ajax, ajax — это односторонняя связь.

    $info = $_POST['info'];
    //this code will be return 
    echo "<pre>".$info."</pre>";
    //this also will not be triggered cause you already return the above code
    //$info = urldecode($info);
    $info = json_decode($info);
    echo "<pre>".$info."</pre>";
 

Комментарии:

1. Это не сработало. Я удалил первое эхо, и оно не работает.

2. $info = json_decode ($info, true); затем вы должны поместить некоторые заголовки, чтобы он действительно возвращал чистый файл json, устанавливающий содержимое в application / json

Ответ №3:

Возможно, установка типа содержимого xhttp как json, например

 <?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data); ?>
 

Как указано в этом ответе.

Комментарии:

1. Я отправляю JSON с помощью javascript, а не php.

2. Да, но я говорил о типе заголовка

Ответ №4:

Глядя на объект, похоже, что у вас есть параметр ‘ внутри вашего кода. Я думаю, что это недопустимо для кодирования.

Комментарии:

1. Я думаю, что вы на правильном пути, но как мне закодировать ‘?

2. Откуда это берется? Или почему вы должны иметь это там?

3. Отдельный файл .js

Ответ №5:

Используя json_decode следующим образом:

 $info = json_decode($info);
 

Вернет переменную PHP.

Если вы добавите ассоциативный параметр как true (по умолчанию false), например:

 $info = json_decode($info, true);
 

Затем он вернет ассоциативный массив

http://php.net/manual/en/function.json-decode.php

Ответ №6:

Я боролся с этим на своем компьютере с Windows 10, версия PHP 5.5.9, только чтобы обнаружить, что php_json.dll файла не было в папке ext моей установки и, очевидно, не было расширения для раскомментирования в файле php.ini. Я нашел dll по адресу http://originaldll.com/file/php_json.dll/31989.html . После копирования его в мою папку ext я добавил extension=php_json.dll к моему файлу php.ini и перезапустил мой сервер apache, и он начал работать нормально.