Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JSON序列化接口,JsonSerializable

JSON序列化接口,JsonSerializable

作者头像
宣言言言
发布于 2019-12-18 08:41:32
发布于 2019-12-18 08:41:32
1.8K00
代码可运行
举报
文章被收录于专栏:宣言(Siam)博客宣言(Siam)博客
运行总次数:0
代码可运行

写在前面

php中操作json的函数有json_encode(),json_decode()

在该文档中,encode的传入值可以是除了resource 类型之外的任何数据类型。

简单序列化一个类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Siam{
    public $name = 'siam';
    protected $age = 21;
    private $sex = "男";
    public static $lover = "undefined";

    public function test()
    {
        return "??";
    }
}

echo json_encode(new Siam());

// 得到  {"name":"siam"}

默认的json_encode,只能序列化类中的public属性。

自定义类的序列化接口

php还提供了一个自定义类序列化的接口,JsonSerializable

实现 JsonSerializable 的类可以 在 json_encode() 时定制他们的 JSON 表示法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JsonSerializable {
    /* 方法 */
    abstract public jsonSerialize ( void ) : mixed
}

需要实现的方法jsonSerialize(),它的返回值:

返回能被 json_encode() 序列化的数据, 这个值可以是除了 resource 外的任意类型。

简单测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Siam implements  JsonSerializable
{
    public $name = 'siam';
    protected $age = 21;
    private $sex = "男";
    public static $lover = "undefined";

    public function test()
    {
        return "??";
    }

    public function jsonSerialize()
    {
        return [
            'name' => $this->name,
            'age'  => $this->age,
            'lover'=> self::$lover
        ];
    }
}

echo json_encode(new Siam());

// 得到 {"name":"siam","age":21,"lover":"undefined"}

当我们定义一些类的时候,它们经常参与json序列化和传输,同时默认的public属性序列化不能满足,我们就可以自定义序列化接口,提供我们想要的数据。

总结

  • json不能序列化资源
  • json序列化类的时候默认只序列化public属性
  • php提供了JsonSerializable自定义序列化接口
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入学习PHP中的JSON相关函数
在我们当年刚刚上班的那个年代,还全是 XML 的天下,但现在 JSON 数据格式已经是各种应用传输的事实标准了。最近几年开始学习编程开发的同学可能都完全没有接触过使用 XML 来进行数据传输。当然,时代是一直在进步的,JSON 相比 XML 来说,更加地方便快捷,可读性更高。但其实从语义的角度来说,XML 的表现形式更强。
硬核项目经理
2021/09/24
7670
php serialize讲解与json性能测试
序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
全栈程序员站长
2022/07/08
7850
经验分享 | PHP-反序列化(超细的)
ps:很多小伙伴都催更了,先跟朋友们道个歉,摸鱼太久了,哈哈哈,今天就整理一下大家遇到比较多的php反序列化,经常在ctf中看到,还有就是审计的时候也会需要,这里我就细讲一下,我建议大家自己复制源码去搭建运行,只有自己去好好理解,好好利用了才更好的把握,才能更快的找出pop链子,首先呢反序列化最重要的就是那些常见的魔法函数,很多小伙伴都不知道这个魔法函数是干啥的,今天我就一个一个,细致的讲讲一些常见的魔法函数,以及最后拿一些ctf题举例,刚开始需要耐心的看,谢谢大家的关注,我会更努力的。
F12sec
2022/09/29
2.3K0
经验分享 | PHP-反序列化(超细的)
PHP 面向对象知识点
定义基本的类: 在类中我们可以定义各种数据成员和成员函数,其中public修饰的函数与变量可以在任何地方被调用,而private修饰的函数只能在本类中被调用子类不可调用,而protected修饰的则可以在本类和子类中被调用但不可以在外部调用.
王瑞MVP
2022/12/28
7730
肝了两天!PHP反序列化漏洞从入门到深入8k图文介绍,以及phar伪协议的利用
本文内容主要分为三个部分:原理详解、漏洞练习和防御方法。这是一篇针对PHP反序列化入门者的手把手教学文章,特别适合刚接触PHP反序列化的师傅们。本文的特色在于对PHP反序列化原理进行了深入细致的分析,并提供了一系列由简入深的PHP反序列化习题,配以详细的练习和分析讲解。
小羽网安
2024/07/30
4550
分享一个 JSON 相关小需求的解决过程与思路
昨天同事问我,能不能在接口返回中不要将中文转成 Uncode 编码,因为这是 Laravel 框架做的事情,所以我们要实现这个效果无非就是在 json_encode 第二个参数中加入常量 JSON_UNESCAPED_UNICODE 选项即可,但是我们在控制器返回的是对象,或者是数组,这个 encode 动作是框架最后输出前完成的。应该是一个非常小小小的需求了。
overtrue
2019/05/14
9331
PHP序列化漏洞原理
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。常见的php系列化和反系列化方式主要有:serialize,unserialize;json_encode,json_decode。
安全小王子
2020/07/31
1.8K0
PHP序列化漏洞原理
如何实现一个优雅的Python的Json序列化库
在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题。Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化。但是这种序列化仅支持python内置的基本类型。
ThoughtWorks
2020/09/10
1.5K0
如何实现一个优雅的Python的Json序列化库
Thinkphp 反序列化利用链深入分析
今年7月份,ThinkPHP 5.1.x爆出来了一个反序列化漏洞。之前没有分析过关于ThinkPHP的反序列化漏洞。今天就探讨一下ThinkPHP的反序列化问题!
Seebug漏洞平台
2019/09/24
1.3K0
Thinkphp 反序列化利用链深入分析
从CTF中学习PHP反序列化的各种利用方式
为了方便数据存储,php通常会将数组等数据转换为序列化形式存储,那么什么是序列化呢?序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。
Ms08067安全实验室
2022/09/26
3.4K0
谈谈JSONAPI在PHP中的应用
现在服务端程序员的主要工作已经不再是套模版,而是编写基于 JSON 的 API 接口。可惜大家编写接口的风格往往迥异,这就给系统集成带来了很多不必要的沟通成本,如果你有类似的困扰,那么不妨关注一下 JSONAPI,它是一个基于 JSON 构建 API 的规范标准,一个简单的 API 接口大致如下所示:
LA0WAN9
2021/12/14
9820
谈谈JSONAPI在PHP中的应用
php反序列化漏洞简单总结
​ 这其实是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,总不能你永远不让它销毁,等着你吧,于是人们就想出了一种能长久保存对象的方法,这就是 PHP 的序列化,那当我们下次要用的时候只要反序列化一下就 ok 啦。
pankas
2022/08/10
7680
php反序列化漏洞简单总结
PHP Phar反序列化浅析
文章首发于跳跳糖社区https://tttang.com/archive/1732
用户9691112
2023/05/18
1.3K0
PHP Phar反序列化浅析
PHP-序列化与反序列化
1.5 序列化与反序列化 在PHP中,数组和对象无法保存,如果需要保存就要将数组或对象转换成一个序列。 序列化:将数组或对象转换成一个序列(serialize) 反序列化:将序列化的字符串转换成数组
cwl_java
2022/11/30
3650
PHP-序列化与反序列化
使用Serializable接口来自定义PHP中类的序列化
关于PHP中的对象序列化这件事儿,之前我们在很早前的文章中已经提到过 __sleep() 和 __weakup() 这两个魔术方法。今天我们介绍的则是另外一个可以控制序列化内容的方式,那就是使用 Serializable 接口。它的使用和上述两个魔术方法很类似,但又稍有不同。
硬核项目经理
2020/05/29
1.5K0
PHP中对象的序列化和反序列化
serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。
宣言言言
2019/12/18
1.4K0
初探序列化与反序列化
在写程序尤其是写网站的时候,经常会构造类,并且有时候会将实例化的类作为变量进行传输。
偏有宸机
2020/11/04
8350
初探序列化与反序列化
PHP 中 Serialize 和 JSON 的区别和在 WordPress 中如何使用
​在 PHP 中,Serialize 和 JSON 是 PHP 和 WordPress 开发中的数据处理的常用方法,那么它们有什么区别呢?在 WordPress 中又如何使用​呢?
Denis
2023/04/13
6K0
ThinkPHP8 反序列化调用链
去年暑假,ThinkPHP发布了8.0版本。当时也是尝试着挖掘一条反序列化调用链,相比ThinkPHP 6,不少类做了变动,外加上还做了declare (strict_types = 1);的限制,让利用变的有些许的难。 最近还是将这个任务重新捡了起来,最后也是成功找到了一条调用链并成功利用,这里就分享成功利用的部分。
Al1ex
2024/07/05
1570
ThinkPHP8 反序列化调用链
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
__sleep 与 __wakeup 序列化: 将一个对象转化成字符串 反序列化:将一个字符串转换成对象
Baige
2022/03/22
1.3K0
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
相关推荐
深入学习PHP中的JSON相关函数
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验