首页 >后端开发 >php教程 >如何使用Jsonserializable界面

如何使用Jsonserializable界面

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-02-21 10:33:13126浏览

How to Use the JsonSerializable Interface

如何使用Jsonserializable界面

在过去的几年中,JSON接管了数据互换格式的国王。在JSON之前,XML统治了栖息地。它擅长建模复杂的数据,但是很难解析,而且非常详细。 JSON确实随着Ajax驱动的站点的扩散而脱颖而出,因为它是一种非常可读的格式,快速解析,其简单的密钥/价值表示削减了XML的所有冗长。

>我认为我们都可以同意,编写较少的代码又需要更少的维护,而较少的错误是我们都希望实现的目标。在这篇文章中,我想向您介绍一个鲜为人知的界面,该界面是在PHP 5.4.0中引入的,称为Jsonserializable。 在可用jsonserializable接口之前,

返回json编码对象的json代表以进行消费服务。

钥匙要点

PHP 5.4.0中的JsonSerializable接口

提供了一种更有效的方法来返回对象的JSON编码表示形式,从而消除了对象外部构造数据结构或将对象内的编码功能内化的需求。

jsonserializable接口允许在类中实现jsonserialize方法,当该类的实例编码JSON时,该方法会自动触发。此方法返回对象数据的数组,简化了如果需要更改,则更新数据的过程。
    实现JsonSerializable接口可增强代码可维护性并降低引入错误的机会,因为它可以消除重复,并使其他人更容易通过检查对象进行编码的能力,以检查该对象是否是JSonSerializable的实例。
  • 丑陋
  • >第一种方法是在对象外构建一个数据结构,其中包含我们要公开的所有数据。
  • >
>我们在这里使用一个数组来保存我们要编码的客户对象的数据,但它很容易成为stdclass。

这种方法很灵活,并且在非常简单的情况下达到了目的,我们知道客户对象不会改变,我们只需要以这种格式的客户数据,在这个地方。如果需要的话,我们还可以选择从其他来源添加数据。

> 但是,由于我们一次或一次经历过,我们做出的假设可以在一会儿通知中被证明是错误的。我们可能需要要求我们在客户类中添加更多数据。这些新数据将需要返回到消费服务,我们希望在许多地方进行此操作。您可以想象,这种方法很快变得麻烦。我们不仅必须在我们的应用程序上复制此数组代码,而且还必须记住要更新所有这些实例时,当更多更改不可避免地进来时。但是,这有另一种方法,这将有助于我们无效这些问题。

不良

幸运的是,当第一个更改请求进来时,我们很聪明,我们意识到复制阵列将是一场噩梦,因此我们决定要做的是内部化对象中的编码功能,从而消除了维护问题并减少了维护问题引入错误的可能性。

现在,如果还有更多更改请求,希望将更多数据添加到客户对象中并返回,我们可以更新tojson方法。
<span><span><?php
</span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>private $email = null;
</span></span><span>    <span>private $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>$data = [
</span></span><span>    <span>'customer' => [
</span></span><span>        <span>'email' => $customer->getEmail(),
</span></span><span>        <span>'name' => $customer->getName()
</span></span><span>    <span>]
</span></span><span><span>];
</span></span><span>
</span><span><span>echo json_encode($data);</span></span>

这种方法具有自己的缺点。随之而来的其他人想要使用我们的客户的人都需要意识到这一方法,因为这不是很容易检查的东西,因此我们需要准确的文档。我们还必须记住,现在此方法

现在返回

JSON(尽管我们可以将序列化移到方法之外)。这使得将客户数据与其他数据源组合起来更加尴尬,因为我们必须小心不要再次编码此方法的结果,因为这会导致一些讨厌的错误。

最后,输入Jsonserializable界面。这为我们提供了丑陋场景的所有灵活性,并具有不良情况的可维护性优势。尽管要使用此界面,您仍需要运行PHP 5.4.0,无论如何您都应该这样做,因为对较旧版本有很多改进。

>

>,从事业务。

如您所见,我们通过将界面添加到我们的类中,然后将JsonSerialize方法添加到同类的正文中以满足接口合同。 在JSonSerialize方法中,我们构建并返回对象数据的数组,就像对其他示例一样。如果有任何变化,我们可以再次更新此方法。您会注意到jsonserialize方法只是返回一个数组。

魔术是在您要触发此方法时出现的,我们现在要做的就是JSON编码此类实例,此方法将自动称为“返回的数据数组”,然后编码!现在,该类实现接口,我们可以从能够检查此类是否是JsonSerializable的实例中受益。如果您想要的话,您还可以在方法中键入提示,以确保传递Jsonserializable接口。
<span><span><?php
</span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>public $email = null;
</span></span><span>    <span>public $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function toJson()
</span></span><span>    <span>{
</span></span><span>        <span>return json_encode([
</span></span><span>            <span>'customer' => [
</span></span><span>                <span>'email' => $this->getEmail(),
</span></span><span>                <span>'name' => $this->getName()
</span></span><span>            <span>]
</span></span><span>        <span>]);
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>echo $customer->toJson();</span></span>

摘要

通过这种简单的实现,我们删除了重复,减少了维护量并减少了引入错误的机会。我们还使使用我们的代码来测试对象的能力来编码是否是JSonserializable的实例来测试对象的能力。

>上面的示例当然是人为的,但是,我希望我设法证明了使用此界面的好处,并激发了您自己继续使用。

经常询问有关JSonserializable接口的问题(常见问题解答)

> php?

中JsonSerializable接口的主要目的是什么,PHP中的Jsonserializable接口主要用于自定义对象的JSON表示。当对象传递到JSON_ENCODE()函数时,如果它实现了JsonSerializable接口,则将调用JsonSerialize()方法,从而允许对象决定如何序列化。这提供了对JSON输出的高度控制,使得在编码数据之前更容易管理复杂的数据结构或对数据进行转换。 jsonserialize()方法是jsonserializable接口的一部分。当实现此接口的对象传递给JSON_ENCODE()时,jSonserialize()方法会自动调用。此方法应返回准备序列化为JSON的数据结构。这可能是一个数组,一个字符串,一个数字,甚至是另一个对象。然后,返回的数据将由JSON_ENCODE()编码为JSON字符串。

>我可以使用jsonserializable界面与私有属性吗?

是的,您可以将jsonserializizizizizable接口与私人属性一起使用。 jsonserialize()方法可以访问对象的私有和受保护的属性,从而使您可以将这些属性包含在返回的序列化数据中。当您想将对象的内部状态编码为JSON时,这可能很有用,但仍将属性保留在类中。 >如果在jsonserialize()方法中抛出异常,则不会被json_encode()捕获。相反,JSON_ENCODE()将返回false,并且需要单独捕获和处理例外。要处理jsonserialize()中的异常,您可以在方法本身中使用一个try-catch块,从而使您可以管理异常并返回有效的数据结构以序列化。 我可以使用jsonserializizable界面来解码JSON ?

不,jsonserializable接口仅用于将对象编码为JSON。要解码JSON,您将使用JSON_DECODE()函数。但是,您可以在类中创建一种方法来处理JSON字符串的对象的解码和重建。

>如何使用嵌套对象使用jsonserializable接口?

>如果您有一个包含其他对象的对象,并且要将整个结构编码到JSON中,则每个嵌套对象还必须实现jsonserialializizizizizizizizizizizizizizizizizizizizizizizizizizizizi面接口。当在父对象上调用JSON_ENCODE()时,它还将在每个嵌套对象上调用jsonserialize(),允许每个对象指定应如何序列化。

>

>我可以使用jsonserializable interface带有阵列吗? >

是的,您可以使用数组使用JsonSerializable接口。如果数组包含对象,则每个对象都应实现jsonserializable接口。当在数组上调用json_encode()时,它将在数组中的每个对象上调用jsonserialize(),允许每个对象都可以决定如何序列化。

>

>我如何使用JSON OUTPUTS自定义JSON OUTPUT ?

您可以通过从jsonserialize()方法返回自定义数据结构来自定义JSON输出。这可能是带有自定义键,字符串,数字或其他对象的数组。您从jsonserialize()返回的数据结构将是编码为json的数据。

我可以使用多维阵列使用jsonserializable界面吗?

是的,您可以使用jsonserializable界面的接口多维阵列。如果数组包含对象,则每个对象都应实现JsonSerializable接口。当在多维阵列上调用JSON_ENCODE()时,它将在数组中的每个对象上调用JsonSerialize(),允许每个对象都可以决定如何序列化。

>

我可以使用jsonserializable interface and jsonserializable界面阵列?

是的,您可以使用具有非缔合数组的Jsonserializizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizable界面。如果数组包含对象,则每个对象都应实现jsonserializable接口。当json_encode()在非求和数组上调用时,它将在数组中的每个对象上调用jsonserialize(),允许每个对象都决定如何序列化。

>

以上是如何使用Jsonserializable界面的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn