zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    bug排查
    做接口测试没反应
    wcf配置文件
    mvc学习-编辑提交需要注意-mvc重点
    大批量导出思路
    进程基础知识
    (转)JMS事务
    (转)JMS简明学习教程
    (转)Linux下使用system()函数一定要谨慎
    LInux文件基础知识和文件目录操作(二)文件I/O操作
  • 原文地址:https://www.cnblogs.com/youxin/p/2733153.html
Copyright © 2011-2022 走看看