比如阿里、騰訊、百度在提供第三方服務的時候都是通過JSON或XML進行傳遞數據。在工作的時候和第三方公司對接的時候也是這兩種數據格式,所以在這總結一下這兩種格式的封裝和解析。
JSON的封裝和解析
封裝JSON數據
<?php
$items = array(
array('id'=>1,'name'=>"衣服",'parId'=>0),
array('id'=>2,'name'=>"書籍",'parId'=>0),
array('id'=>3,'name'=>"T恤",'parId'=>1),
array('id'=>4,'name'=>"褲子",'parId'=>1),
array('id'=>5,'name'=>"鞋子",'parId'=>1),
array('id'=>6,'name'=>"皮鞋",'parId'=>5),
array('id'=>7,'name'=>"運動鞋",'parId'=>5),
array('id'=>8,'name'=>"耐克",'parId'=>7),
array('id'=>9,'name'=>"耐克",'parId'=>3),
array('id'=>10,'name'=>"鴻星爾克",'parId'=>7),
array('id'=>11,'name'=>"小說",'parId'=>2),
array('id'=>12,'name'=>"科幻小說",'parId'=>11),
array('id'=>13,'name'=>"古典名著",'parId'=>11),
array('id'=>14,'name'=>"文學",'parId'=>2),
array('id'=>15,'name'=>"四書五經",'parId'=>14)
);
$message = json_encode($items,JSON_UNESCAPED_UNICODE);
echo $message;
效果:

描述:第二參數是將中文不轉為UNICODE的編碼(JSON_UNESCAPED_UNICODE),默認轉換成UNICODE的編碼;
解析JSON數據
<?php
$str = '[{"id":1,"name":"衣服","parId":0},{"id":2,"name":"書籍","parId":0},{"id":3,"name":"T恤","parId":1},{"id":4,"name":"褲子","parId":1},
{"id":5,"name":"鞋子","parId":1},{"id":6,"name":"皮鞋","parId":5},{"id":7,"name":"運動鞋","parId":5},{"id":8,"name":"耐克","parId":7},
{"id":9,"name":"耐克","parId":3},{"id":10,"name":"鴻星爾克","parId":7},{"id":11,"name":"小說","parId":2},{"id":12,"name":"科幻小說","parId":11},
{"id":13,"name":"古典名著","parId":11},{"id":14,"name":"文學","parId":2},{"id":15,"name":"四書五經","parId":14}]';
$res = json_decode($str, true);
var_dump($res);
效果:

描述:第二個參數是將數據轉換為數組的格式(true),默認是json對象的格式
XML的封裝和解析
<?php
/**
* XML 工具類,用於構建與解析 XML.
*/
class XmlUtils
{
/**
* XML 轉換為數組.
* @param string $xml XML string
* @return array
*/
public static function parse($xml)
{
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
if (is_object($data) && get_class($data) === 'SimpleXMLElement') {
$data = self::arrarval($data);
}
return $data;
}
/**
* XML編碼
* @param mixed $data 數據
* @param string $root 根節點名
* @param string $item 數字索引的子節點名
* @param string $attr 根節點屬性
* @param string $id 數字索引子節點key轉換的屬性名
* @return string
*/
public static function build($data, $root = 'xml', $item = 'item', $attr = '', $id = 'id')
{
if (is_array($attr)) {
$_attr = array();
foreach ($attr as $key => $value) {
$_attr[] = "{$key}=\"{$value}\"";
}
$attr = implode(' ', $_attr);
}
$attr = trim($attr);
$attr = empty($attr) ? '' : "{$attr}";
$xml = "<{$root} {$attr}>";
$xml .= self::data2Xml($data, $item, $id);
$xml .= "</{$root}>";
return $xml;
}
/**
* 生成.
* @param string $string 內容
* @return string
*/
public static function cdata($string)
{
return sprintf('%s', $string);
}
/**
* 把對象轉換成數組.
* @param string $data 數據
* @return array
*/
private static function arrarval($data)
{
if (is_object($data) && get_class($data) === 'SimpleXMLElement') {
$data = (array)$data;
}
if (is_array($data)) {
foreach ($data as $index => $value) {
$data[$index] = self::arrarval($value);
}
}
return $data;
}
/**
* 轉換數組為xml.
* @param array $data 數組
* @param string $item item的屬性名
* @param string $id id的屬性名
* @return string
*/
private static function data2Xml($data, $item = 'item', $id = 'id')
{
$xml = $attr = '';
foreach ($data as $key => $val)
{
if (is_numeric($key))
{
$id&&$attr = "{$id}=\"{$key}\"";
$key = $item;
}
$xml .= "<{$key} {$attr}>";
if ((is_array($val) || is_object($val))) {
$xml .= self::data2Xml((array)$val, $item, $id);
} else {
$xml .= is_numeric($val) ? $val : self::cdata($val);
}
$xml .= "</{$key}>";
}
return $xml;
}
}
