首页 > 编程语言 >PHP 中优雅的将JSON/XML/YAML 等数据反序列化成指定的类对象

PHP 中优雅的将JSON/XML/YAML 等数据反序列化成指定的类对象

时间:2023-07-26 21:48:02浏览次数:40  
标签:XML function 序列化 name YAML JSON PHP public createdAt

这个小事情何以需要记上一笔?实在是因为当用了各种编程语言以后,发现系统 I/O处,尤其对外的接口Interface最重要,它或许可以被称为 Specification ,规约。

PHP 是混合型编程风格的语言,不强求完全的OOP。但是代码不OOP化的话,又得不到更多的开发工具的支持。尤其在PHP中如果只是用数组结构处理这种 接口处的强spec场景,在Editor/IDE中的代码就很难达到易读性(不便于它们理解,也就不便于人理解)。

因此以前在很多项目中,会尝试手动做这样的对象化的结构转换,将接收到的请求报文,映射成一个预先定义了清晰结构的Class实例化对象上。这个过程,专业叫法应该叫 “序列化/反序列化(serialize / unserialize)”。多数编程语言都有相应的内置的方法,PHP也有。

这种序列化反序列化,狭义的讲法,是指编程语言级别的算法。不过我们面临的不仅仅是这种情况,甚至更多的不是这种情况,框架会在底层解决掉,应用中往往都很少意识到。更多的情况是跨系统间的数据结构的序列化,比如XML<=> Java/PHP/...、以及当前更主流的 JSON <=> Java/PHP/...

像多数有点年岁的编程语言比如Java一样,PHP 也不太可能原生支持 JSON 类型,最多类型化为对象式访问结构,当然PHP中可以直接decode(某种“反序列化”)为更原生的数组结构或者stdclass(像是某种匿名类对象)。如前所述,这种过程在实际应用开发中,是非常重要的涉及系统稳定性维护的环节。

因此,严肃认真的人会系统性的去研究,并实现解决方案,比如 Symfony/Serializer 组件。

The Serializer component is meant to be used to turn objects into a specific format (XML, JSON, YAML, ...) and the other way around.

原理倒还是以 PHP的 数组为中介,进行两个方向的转换,

它将序列化的过程拆解成了两个子过程,encode/decode;normalize/denoralize 。

示意图如下:

安装:

 composer require symfony/serializer`

用法:

比如预先定义一个对象结构:

class Person
{
    private int $age;
    private string $name;
    private bool $sportsperson;
    private ?\DateTimeInterface $createdAt;

    // Getters
    public function getAge(): int
    {
        return $this->age;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->createdAt;
    }

    // Issers
    public function isSportsperson(): bool
    {
        return $this->sportsperson;
    }

    // Setters
    public function setAge(int $age): void
    {
        $this->age = $age;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function setSportsperson(bool $sportsperson): void
    {
        $this->sportsperson = $sportsperson;
    }

    public function setCreatedAt(\DateTimeInterface $createdAt = null): void
    {
        $this->createdAt = $createdAt;
    }
}

然后就可以从其它数据源如xml来反序列化成对象。

use App\Model\Person;

$data = <<<EOF
<person>
    <name>foo</name>
    <age>99</age>
    <sportsperson>false</sportsperson>
</person>
EOF;

$person = $serializer->deserialize($data, Person::class, 'xml');

有更多高级用法,详见:https://symfony.com/doc/current/components/serializer.html

标签:XML,function,序列化,name,YAML,JSON,PHP,public,createdAt
From: https://www.cnblogs.com/x3d/p/php-serializer-unserializer-symfony.html

相关文章

  • xml声明式事务控制
    1、applicationContext.xml配置<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:contex......
  • java 将枚举转Json
    Java将枚举转为JSON引言在Java开发中,有时候需要将枚举类型转换为JSON格式。这样可以方便地在不同的系统或平台之间传递数据。本文将介绍如何使用Java代码实现将枚举类型转换为JSON格式的步骤和代码示例。流程概述下面是将枚举转为JSON的整个流程概述:步骤操作步骤1导......
  • PHPJSON嵌套对象和数组的解析方法
    PHPJSON嵌套对象和数组的解析方法在PHP编程开发中,JSON是一种非常常用的数据格式。它具有简单、轻量和易于解析的特点,非常适合用于数据交换和存储。当我们处理JSON数据时,经常需要解析嵌套的对象和数组,本文将介绍几种解析方法。1.使用json_decode函数解析在PHP中,我们可以使用jso......
  • 重定向和转发、JSON
     #重定向和转发转发:跳转页面,URL不变重定向:跳转页面,URL变化页面:{视图解析器前缀}+viewName+{视图解析器后缀} ##通过SpringMVC实现-重定向,不需要视图解析器,本质就是重新请求一个新地方-可以重定向到另外一个请求实现```java@ControllerpublicclassRes......
  • Python读写JSON文件的两种方式
    1.把文件读取为字符串,然后转换为json数据(dict格式),loadsanddumps关键点:写入json文件的时候,要指定ensure_ascii参数为False,否则中文编码虽然为utf_8,但仍然无法显示中文,而是\uxxx形式的编码。new_json_string=json.dumps(json_data,ensure_ascii=False)importjsondefr......
  • Using PL/SQL Object Types for JSON
    #https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/using-PLSQL-object-types-for-JSON.html#GUID-F0561593-D0B9-44EA-9C8C-ACB6AA9474EEDECLAREjeJSON_ELEMENT_T;joJSON_OBJECT_T;BEGINje:=JSON_ELEMENT_T.parse('{"name......
  • spring-boot-yaml的用法
    1.yaml简洁以数据为核心·基本语法大小写敏感数值前必须要有空格,作为分割符·数据格式对象数组(使用“-”表示数组每个元素)常量·参数引用$server:port:2023#数据的定义name:lisi#对象的定义person:name:${lisi}age:12......
  • xpath丶BeautifulSoup丶pyquery丶jsonpath 解析html与json串
    XPath与jsonpath1importjson2fromlxmlimportetree3fromjsonpathimportjsonpath45defjson_test():6str1='{"name":"埃里克森"}'7#将字符串转为Pythondict对象8js_obj=json.loads(str1)9print(typ......
  • yaml格式
       ......
  • json 包 转字符串为dict json.loads(data_str)
    importjson##假设有一个JSON对象#data={#"name":"John",#"age":30,#"city":"NewYork"#}###将JSON对象转换为字符串#json_str=json.dumps(data)##print(json_str)#str转json类型是字典data_......