json_decode()不起作用

时间:2016-10-15 02:10:49

标签: php json ajax syntax

我使用ajax使用JSON发送数据并且它一直返回null。这是我发送的字符串:

{"username":"HittmanA","code":"%601234567890-%3D~!%40%23%24%25%5E%26*()_%2Bqwertyuiop%5B%5D%5CQWERTYUIOP%7B%7D%7Casdfghjkl%3B'ASDFGHJKL%22zxcvbnm%2C%2FZXCVBNM%3C%3E%3F","name":"Untitled-1"}

通过邮寄发送。这是我发送的代码:

       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 && 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()doest工作。这里再次是我发送的JSON:

{"username":"HittmanA","code":"%601234567890-%3D~!%40%23%24%25%5E%26*()_%2Bqwertyuiop%5B%5D%5CQWERTYUIOP%7B%7D%7Casdfghjkl%3B'ASDFGHJKL%22zxcvbnm%2C%2FZXCVBNM%3C%3E%3F","name":"Untitled-1"}

第一个回声正常工作,但第二回声没有。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:1)

json_decode()必须发出您未检查的错误。像json_decode()json_encode()这样的函数不显示错误,您必须使用json_last_error,因为PHP 5.5还有json_last_error_msg()

<?php

$str = '{"username":"HittmanA","code":"%601234567890-%3D~!%40%23%24%25%5E%26*()_%2Bqwertyuiop%5B%5D%5CQWERTYUIOP%7B%7D%7Casdfghjkl%3B\'ASDFGHJKL%22zxcvbnm%2C%2FZXCVBNM%3C%3E%3F","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%22zxcvbnm%2C%2FZXCVBNM%3C%3E%3F","name":"Untitled-1"}"
class stdClass#1 (3) {
  public $username =>
  string(8) "HittmanA"
  public $code =>
  string(136) "%601234567890-%3D~!%40%23%24%25%5E%26*()_%2Bqwertyuiop%5B%5D%5CQWERTYUIOP%7B%7D%7Casdfghjkl%3B\'ASDFGHJKL%22zxcvbnm%2C%2FZXCVBNM%3C%3E%3F"
  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 :(得分:0)

如果你在php中回显等于返回或在某些函数式编程中打印,那么你好先生。 如果您使用ajax,则ajax是单向通信。

import boto3

instances = [i for i in boto3.resource('ec2', region_name='ap-southeast-2').instances.all()]

# Print instance_id of instances that do not have a Tag of Key='Foo'
for i in instances:
  if 'Foo' not in [t['Key'] for t in i.tags]:
    print i.instance_id

答案 2 :(得分:0)

像这样使用json_decode:

$info = json_decode($info);

将返回PHP变量。

如果将关联参数添加为true(默认为false),请执行以下操作:

$info = json_decode($info, true);

然后它将返回一个关联数组

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

答案 3 :(得分:0)

也许将xhttp内容类型设置为json,如

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

如本回答所述。

答案 4 :(得分:0)

查看对象,看起来你的代码参数里面有'。我认为这对编码无效。

答案 5 :(得分:0)

我在Windows 10机器(PHP 5.5.9版)上为此苦苦挣扎,只是发现php_json.dll文件不在我安装的ext文件夹中,并且显然在php.ini文件中没有取消注释的扩展名。我在http://originaldll.com/file/php_json.dll/31989.html找到了dll。将其复制到ext文件夹后,我将extension = php_json.dll添加到了php.ini文件中,并重新启动了Apache服务器,它开始正常工作。