php输出Json

从5.2版本开始,PHP原生提供json_encode()json_decode()函数,前者用于编码,后者用于解码。

json_encode — 对变量进行 JSON 编码,并返回 value 值的 JSON 形式,例如:

<?php
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
?>

以上代码执行后输出:

{"a":1,"b":2,"c":3,"d":4,"e":5}

假如要编码的数据源(一般是一个数组),value 中包含中文,经过 json_encode 处理后输出的是 unicode 编码。

<?php
$arr = array ('a'=>'芒果小站');
echo json_encode($arr);
?>

以上代码执行后输出:

{"a":"\u8292\u679C\u5C0F\u7AD9"}

PHP 底层已经做了 unicode 处理,如果嫌它不够直观,可以利用 urlencode 和 urldecode 方法绕过这个转码为 unicode 的过程:

$arr = array ('a'=>urlencode('芒果小站'));
echo urldecode(json_encode($arr));

以上代码执行后输出:

{"a":"芒果小站"}

如果输出的还是乱码,就是编码 的问题,再加一句

header("Content-type:text/html;charset='utf-8'");

就可以搞定。

string json_encode ( mixed $value [, int $options = 0 ] )

$value可以是任何类型,除了resource。The value being encoded. Can be any type except a resource.

我们想要对utf-8不转义称unicode,

可以options是 JSON_UNESCAPED_UNICODE.

JSON和js一样,对于客户端的字符都是以UTF8的形式进行处理的,也就是说,使用JSON作为提交和接收的数据格式时字符都采用UTF8编码处理,当我们的页面编码和数据库编码不是采用UTF8的时候,就极容易出现中文乱码的问题。解决办法自然是在用js或者PHP处理JSON数据的时候都采用UTF8的形式。

 PHP5.2或以上的版本把json_encode作为内置函数来用,给网站制作者带来了很大的方便,但是我们必须注意到json_encode只支持UTF8编码的字符,否则,中文乱码或者空值就出现了。增加options解决乱码问题:

$a=array('a'=>'网站');
echo json_encode($a,JSON_UNESCAPED_UNICODE);

输出{"a":"网站"};

 

将对象转成json:

$obj->body='another post';
$obj->id=21;
$obj->approved=true;
$obj->favorite_count=1;
$obj->status=NULL;

echo json_encode($obj);

输出:

 {
    "body":"another post",
    "id":21,
    "approved":true,
    "favorite_count":1,
    "status":null
  }

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

索引数组和关联数组

PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

比如,现在有一个索引数组

  $arr = Array('one', 'two', 'three');
  echo json_encode($arr);

 结果为:

 ["one","two","three"]

如果将它改为关联数组:

$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');

  echo json_encode($arr);

结果就变了:

 {"1":"one","2":"two","3":"three"}

 json_encode(array(4 => "four", 8 => "eight"));

这个关联数组输出:

   {"4":"four","8":"eight"}

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

如果你需要将"索引数组"强制转化成"对象",可以这样写

   json_encode( (object)$arr );

或者

json_encode ( $arr, JSON_FORCE_OBJECT );

类(class)的转换

下面是一个PHP的类:

class Foo {
    const ERROR_CODE = '404';
    public $public_ex = 'this is public';
    private $private_ex = 'this is private!';
    protected $protected_ex = 'this should be protected'; 

    public function getErrorCode() {
      return self::ERROR_CODE;
    }
  }

现在,对这个类的实例进行json转换:

$foo = new Foo;
  $foo_json = json_encode($foo);
  echo $foo_json;

  输出结果是

   {"public_ex":"this is public"}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

json_decode()

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

Takes a JSON encoded string and converts it into a PHP variable.

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

 $json = '{"foo": 12345}';

  $obj = json_decode($json);
  print $obj->{'foo'}; // 12345

 json_decode同json_encode一样,把{ }对象转为对象,把【】 数组转成array。

下面的返回一个对象

 $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

  var_dump(json_decode($json));

结果就是生成一个PHP对象:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
  }

把【】 数组转成array。

 $arr=array(
 
        array('a'=>'a1','b'=>'b1'),
        array(0,1,2)
        );
        
print_r( json_decode(json_encode($arr,JSON_UNESCAPED_UNICODE)));

s输出:

Array
(
    [0] => stdClass Object
        (
            [a] => a1
            [b] => b1
        )

    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

)

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:

当增加true时,When TRUE, returned objects will be converted into associative arrays.

结果就生成一个关联数组:

array(5) {
     ["a"] => int(1)
     ["b"] => int(2)
     ["c"] => int(3)
     ["d"] => int(4)
     ["e"] => int(5)
  }

json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?

 $bad_json = "{ 'bar': 'baz' }";

  $bad_json = '{ bar: "baz" }';

  $bad_json = '{ "bar": "baz", }';

对这三个字符串执行json_decode()都将返回null,并且报错。

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。

 var_dump(json_decode("Hello World")); //null

上面的一部分来源:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html

还有一份文章php数据库导出类 导出JSON,XML,WORD,EXCELhttp://www.jz123.cn/text/1036796.html写的很全

correct HTTP header for json file  

header('Content-Type: application/json');

将mysqli_resource转换为Json:

$sth = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
    $rows[] = $r;
}
print json_encode($rows);

json_encode 数组时,什么时候结果是数组什么时候是object?

$arr[0]='a',$arr[1]='a'b json_encode($arr)结果是

 ["a","b"]

$arr[1]='b',$arr[0]='a';json_encode('结果')

 {"1":"a","0":"b"}.这个很奇怪,但是当我们打印出print_r($arr)就知道了。

Array ( [1] => a [0] => b )

(所以,$arr[1]和$arr[0]的顺序对于json_encode很重要)

$arr[0]='a',$arr[2]='c' json_encode($arr)结果

{"0":"a","2":"b"}

json_encode 数值数组得到object的方法:

<?php
 
$array = array('0' => "Website: www.ttlsa.com", '1' => 'E-mail: service@ttlsa.com', '2' => 'QQ群: 39514058');
 
print_r($array);
 
$array = new arrayobject($array);
$a = json_encode($array);
 
echo $b."\n";
?>

 要点在于在json_encode之前先将数组$array转化成对象。

http://www.ttlsa.com/php/method-json_encode-to-generate-the-digital-object/

原文地址:https://www.cnblogs.com/youxin/p/2733153.html