php解析封装JSON与XML

Posted 努力的九月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php解析封装JSON与XML相关的知识,希望对你有一定的参考价值。

比如阿里、腾讯、百度在提供第三方服务的时候都是通过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;

    }

}

  

以上是关于php解析封装JSON与XML的主要内容,如果未能解决你的问题,请参考以下文章

PHP:JSON 或 XML 解析器更快吗?

java与JSON

PHP - xml到json转换:“无法将字符串解析为XML”

使用 json rereiver php mysql 在片段中填充列表视图

在PHP中使用SPL库中的对象方法进行XML与数组的转换

PHP. 03 .ajax传输XML ajax传输json封装