当前位置:首页 > PHP教程 > php高级应用 > 列表

php语言中使用json的技巧及json的实现代码详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-22 09:56:12 浏览: 评论:0 

json是一种比较流行的数据交换格式之一,各大API网站均支持json。通过本篇文章给大家介绍php语言中使用json技巧以及php语言中json的实现,对php语言中使用json技巧及json的实现代码详解感兴趣的朋友一起来本文学习学习吧。

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。

我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识。

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

一、json_encode()

该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:

$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}

再看一个对象转换的例子:

  1. $obj->body      = 'another post'
  2. $obj->id       = 21; 
  3. $obj->approved    = true; 
  4. $obj->favorite_count = 1; 
  5. $obj->status     = NULL; 
  6. echo json_encode($obj); 

结果为:

  1.     "body":"another post",  
  2.     "id":21, 
  3.     "approved":true, 
  4.     "favorite_count":1, 
  5.     "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( (object)$arr );

或者

json_encode ( $arr, JSON_FORCE_OBJECT );

三、类(class)的转换

下面是一个PHP的类:

  1. class Foo { 
  2.     const   ERROR_CODE = '404'
  3.     public  $public_ex = 'this is public'
  4.     private  $private_ex = 'this is private!'
  5.     protected $protected_ex = 'this should be protected'
  6.     public function getErrorCode() { 
  7.       return self::ERROR_CODE; 
  8.     } 

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

  1. $foo = new Foo; 
  2. $foo_json = json_encode($foo); 
  3. echo $foo_json

输出结果是

{"public_ex":"this is public"}

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

四、json_decode()

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

  1. $json = '{"foo": 12345}';   
  2. $obj = json_decode($json);  
  3. print $obj->{'foo'}; // 12345 

通常情况下,json_decode()总是返回一个PHP对象,而不是数组,比如:

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

var_dump(json_decode($json));

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

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

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

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

var_dump(json_decode($json,true));

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

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

五、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

下面给大家介绍哦php语言的json实现

由于开发一个ajax file manager for web开源项目,数据交换使用的json格式,后来发现在低版本的php上运行会有问题,仔细调试发现json_decode和json_encode无法正常工作,于是查阅资料,发现低版本的php没有实现这两个函数,为了兼容性,我只好自己实现一个php版的json编码解码代码,并保证和json2.js的一致,测试调试并通过,现在将其公布出来,供有相同需求的同学使用:

  1. <?php  
  2. /* * ****************************************************************************  
  3.  * $base: $  
  4.  *  
  5.  * $Author: $  
  6.  *   Berlin Qin  
  7.  *  
  8.  * $History: base.js $  
  9.  *   Berlin Qin  //     created  
  10.  *  
  11.  * $contacted  
  12.  *   webfmt@gmail.com  
  13.  *   www.webfmt.com  
  14.  *  
  15.  * *************************************************************************** */ 
  16. /* ===========================================================================  
  17.  * license  
  18.  *  
  19.  * 、Open Source Licenses  
  20.  * webfmt is distributed under the GPL, LGPL and MPL open source licenses.  
  21.  * This triple copyleft licensing model avoids incompatibility with other open source licenses.  
  22.  * These Open Source licenses are specially indicated for:  
  23.  *  Integrating webfmt into Open Source software;  
  24.  *  Personal and educational use of webfmt;  
  25.  *  Integrating webfmt in commercial software,  
  26.  * taking care of satisfying the Open Source licenses terms,  
  27.  *  while not able or interested on supporting webfmt and its development.  
  28.  *  
  29.  * 、Commercial License – fbis source Closed Distribution License - CDL  
  30.  * For many companies and products, Open Source licenses are not an option.  
  31.  * This is why the fbis source Closed Distribution License (CDL) has been introduced.  
  32.  * It is a non-copyleft license which gives companies complete freedom  
  33.  * when integrating webfmt into their products and web sites.  
  34.  * This license offers a very flexible way to integrate webfmt in your commercial application.  
  35.  * These are the main advantages it offers over an Open Source license:  
  36.  *   Modifications and enhancements doesn't need to be released under an Open Source license;  
  37.  *   There is no need to distribute any Open Source license terms alongside with your product  
  38.  * and no reference to it have to be done;  
  39.  *   No references to webfmt have to be done in any file distributed with your product;  
  40.  *   The source code of webfmt doesn't have to be distributed alongside with your product;  
  41.  *   You can remove any file from webfmt when integrating it with your product.  
  42.  * The CDL is a lifetime license valid for all releases of webfmt published during  
  43.  * and before the year following its purchase.  
  44.  * It's valid for webfmt releases also. It includes year of personal e-mail support.  
  45.  *  
  46.  * ************************************************************************************************************************************************* */ 
  47. function jsonDecode($json)  
  48. {  
  49.   $result = array();  
  50.   try 
  51.   {  
  52.     if (PHP_VERSION_ID > )  
  53.     {  
  54.       $result = (array) json_decode($json);  
  55.     }  
  56.     else 
  57.     {  
  58.       $json = str_replace(array("\\\\", "\\\""), array("&#;""&#;"), $json);  
  59.       $parts = preg_split("@(\"[^\"]*\")|([\[\]\{\},:])|\s@is"$json, -, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);  
  60.       foreach ($parts as $index => $part)  
  61.       {  
  62.         if (strlen($part) == )  
  63.         {  
  64.           switch ($part)  
  65.           {  
  66.             case "[":  
  67.             case "{":  
  68.               $parts[$index] = "array(";  
  69.               break;  
  70.             case "]":  
  71.             case "}":  
  72.               $parts[$index] = ")";  
  73.               break;  
  74.             case ":":  
  75.               $parts[$index] = "=>";  
  76.               break;  
  77.             case ",":  
  78.               break;  
  79.             default:  
  80.               break;  
  81.           }  
  82.         }  
  83.       }  
  84.       $json = str_replace(array("&#;""&#;""$"), array("\\\\", "\\\"""\\$"), implode(""$parts));  
  85.       $result = eval("return $json;");  
  86.     }  
  87.   }  
  88.   catch (Exception $e)  
  89.   {  
  90.     $result = array("error" => $e->getCode());  
  91.   }  
  92.   return $result;  
  93. }  
  94. function valueTostr($val)  
  95. {  
  96.   if (is_string($val))   
  97.   {  
  98.     $val = str_replace('\"', "\\\""$val);  
  99.     $val = str_replace("\\", "\\\\", $val);  
  100.     $val = str_replace("/""\\/"$val);  
  101.     $val = str_replace("\t""\\t"$val);  
  102.     $val = str_replace("\n""\\n"$val);  
  103.     $val = str_replace("\r""\\r"$val);  
  104.     $val = str_replace("\b""\\b"$val);  
  105.     $val = str_replace("\f""\\f"$val);  
  106.     return '"' . $val . '"';  
  107.   }  
  108.   elseif (is_int($val))  
  109.     return sprintf('%d'$val);  
  110.   elseif (is_float($val))  
  111.     return sprintf('%F'$val);  
  112.   elseif (is_bool($val))  
  113.     return ($val ? 'true' : 'false');  
  114.   else 
  115.     return 'null';  
  116. }  
  117. function jsonEncode($arr)  
  118. {  
  119.   $result = "{}";  
  120.   try 
  121.   {  
  122.     if (PHP_VERSION_ID > )  
  123.     {  
  124.       $result = json_encode($arr);  
  125.     }  
  126.     else 
  127.     {  
  128.       $parts = array();  
  129.       $is_list = false;  
  130.       if (!is_array($arr))  
  131.       {  
  132.         $arr = (array$arr;  
  133.       }  
  134.       $end = count($arr) - ;  
  135.       if (count($arr) > )  
  136.       {  
  137.         if (is_numeric(key($arr)))  
  138.         {  
  139.           $result = "[";   
  140.           for ($i = ; $i < count($arr); $i++)  
  141.           {  
  142.             if (is_array($arr[$i]))  
  143.             {  
  144.               $result = $result . jsonEncode($arr[$i]);  
  145.             }  
  146.             else 
  147.             {  
  148.               $result = $result . valueTostr($arr[$i]);  
  149.             }  
  150.             if ($i != $end)  
  151.             {  
  152.               $result = $result . ",";  
  153.             }  
  154.           }  
  155.           $result = $result . "]";  
  156.         }  
  157.         else 
  158.         {  
  159.           $result = "{";   
  160.           $i = ;  
  161.           foreach ($arr as $key => $value)  
  162.           {  
  163.             $result = $result . '"' . $key . '":';  
  164.             if (is_array($value))  
  165.             {  
  166.               $result = $result . jsonEncode($value);  
  167.             }  
  168.             else 
  169.             {  
  170.               $result = $result . valueTostr($value);  
  171.             }  
  172.             if ($i != $end)  
  173.             {  
  174.               $result = $result . ",";  
  175.             }  
  176.             $i++;  
  177.           }  
  178.           $result = $result . "}";  
  179.         }  
  180.       }  
  181.       else 
  182.       {  
  183.         $result = "[]";  
  184.       }  
  185.     }  
  186.   }  
  187.   catch (Exception $e)  
  188.   {  
  189.   }  
  190.   return $result;  
  191. }  
  192. ?> 

如果使用过程有什么问题,可以给我email.欢迎大家指出错误!

Tags: json技巧

分享到: