php直接json_encnode对象,将PHP对象序列化为JSON
所以我在
php.net左右徘徊,了解有关将PHP对象序列化为JSON的信息,当我偶然发现新的
JsonSerializable Interface时。它只有PHP> = 5.4,我在5.3.x环境中运行。
这种功能如何实现PHP, 5.4?
我没有使用JSON,但是我试图支持一个API层的应用程序,并将数据对象(否则将发送到视图)转储到JSON是完美的。
如果我试图直接序列化对象,它返回一个空的JSON字符串;这是因为我认为json_encode()不知道对对象做什么。我应该递归地减少对象到数组,然后编码吗?
例
$data = new Mf_Data();
$data->foo->bar['hello'] = 'world';
echo json_encode($ data)产生一个空对象:
{}
var_dump($ data)然而,按预期工作:
object(Mf_Data)#1 (5) {
["_values":"Mf_Data":private]=>
array(0) {
}
["_children":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["foo"]=>
object(Mf_Data)#2 (5) {
["_values":"Mf_Data":private]=>
array(0) {
}
["_children":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["bar"]=>
object(Mf_Data)#3 (5) {
["_values":"Mf_Data":private]=>
array(1) {
[0]=>
array(1) {
["hello"]=>
string(5) "world"
}
}
["_children":"Mf_Data":private]=>
array(0) {
}
["_parent":"Mf_Data":private]=>
*RECURSION*
["_key":"Mf_Data":private]=>
string(3) "bar"
["_index":"Mf_Data":private]=>
int(0)
}
}
}
["_parent":"Mf_Data":private]=>
*RECURSION*
["_key":"Mf_Data":private]=>
string(3) "foo"
["_index":"Mf_Data":private]=>
int(0)
}
}
}
["_parent":"Mf_Data":private]=>
NULL
["_key":"Mf_Data":private]=>
NULL
["_index":"Mf_Data":private]=>
int(0)
}
附录
1)
所以这是我为Mf_Data类设计的toArray()函数:
public function toArray()
{
$array = (array) $this;
array_walk_recursive($array, function (&$property) {
if ($property instanceof Mf_Data) {
$property = $property->toArray();
}
});
return $array;
}
然而,由于Mf_Data对象也有对它们的父(包含)对象的引用,因此递归失败。工作像一个魅力,虽然当我删除_parent引用。
2)
只是为了跟进,最终的功能来转换一个复杂的树节点对象我去与:
// class name - Mf_Data
// exlcuded properties - $_parent, $_index
public function toArray()
{
$array = get_object_vars($this);
unset($array['_parent'], $array['_index']);
array_walk_recursive($array, function (&$property) {
if (is_object($property) && method_exists($property, 'toArray')) {
$property = $property->toArray();
}
});
return $array;
}
3)
我再次跟进,有一点干净的实施。使用接口的instanceof检查看起来比method_exists()更清洁(然而method_exists()交叉切割继承/实现)。
使用unset()似乎有点凌乱,似乎逻辑应该重构到另一个方法。然而,这个实现复制属性数组(由于array_diff_key),所以需要考虑。
interface ToMapInterface
{
function toMap();
function getToMapProperties();
}
class Node implements ToMapInterface
{
private $index;
private $parent;
private $values = array();
public function toMap()
{
$array = $this->getToMapProperties();
array_walk_recursive($array, function (&$value) {
if ($value instanceof ToMapInterface) {
$value = $value->toMap();
}
});
return $array;
}
public function getToMapProperties()
{
return array_diff_key(get_object_vars($this), array_flip(array(
'index', 'parent'
)));
}
}
php直接json_encnode对象,将PHP对象序列化为JSON相关推荐
- Jquery 将表单序列化为Json对象
大家知道Jquery中有serialize方法,可以将表单序列化为一个"&"连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有 ...
- JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象
JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...
- js对象序列化为json字符串
网上找了找将js对象序列化为json字符串的方法.结果都不近人意,最后自己写了一个. 注意你得自己为Date增加toString()方法. function Serialize(obj){switch ...
- C# 对象序列化之序列化为Json文件(一)
目录 1.概念 1.1原理 1.2用途 1.3 JSON序列化 1.4 二进制和XML序列化 2. 序列化为JSON 2.1 简单的序列化 2.2 复杂的序列化 3 忽略属性 3.1 忽略单个属性 3 ...
- 将Roaring Bitmap序列化为JSON
近期在实现一个数据结构时使用到了位图索引(bitmap index)[1],本文就来粗浅聊聊位图(bitmap). 一. 什么是bitmap 位图索引使用位数组(bit array,也有叫bitset ...
- python 数据库查询序列化_python-将sqlalchemy类序列化为json
我正在尝试将sqlalchemy查询的结果(列表)序列化为json. 这是课程: class Wikilink(Base): __tablename__='Wikilinks' __table_arg ...
- Newtonsoft.Json.dll序列化为json,null值自动过滤
Newtonsoft.Json.dll序列化为json,null值自动过滤 原文:Newtonsoft.Json.dll序列化为json,null值自动过滤 var jSetting = new Js ...
- 关于DateTime对象序列化为Json之后的若干问题
将Datetime对象序列化成Json对象是常有的事情,微软的序列化方法会将Datetime对象序列化成一个字符串: "\/Date(1234656000000)\/" 这样的字符 ...
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonToolclass Score:math = 0c ...
最新文章
- 一场事先预告的砸冰箱盛宴
- 什么是codepage?
- 【Flask】Jinja2之模板继承
- MQTT再学习 -- 漫谈MQTT协议
- 使类和成员的可访问性最小化
- es6 --- Promise封装读取文件操作
- img=img%3e128 matlab,Matlab中一般的数值计算和使用
- ibatis 中 $与#的区别
- SpringBoot整合Mybatis-plus实现增删查改
- 计算机专业理科二本录取分数线,这7所211理科录取分数线较低,普通考生记得关注,2所有二本招生...
- activiti流程变量
- 5.5 Transformers的改进--自适应Attention
- 关于left join 一些测试
- 笔记本和android分屏,如何把Android/IOS手机或者平板作为PC电脑显示器的分屏
- DevIL的学习笔记
- 关于arduino驱动SH1106 OLED屏幕使用U8g2库显示案例
- HTML5输入框里加图片代码,做了一个input上传加号框,图片上传后显示在框中,怎么让加号消失?...
- 时空之巅服务器在线玩,天域之巅 - 《神鬼传奇》官方网站
- 【深度学习图像识别课程】毕业项目:狗狗种类识别(1)环境准备
- java zmq订阅_java zmq消息队列
热门文章
- 数据结构 队列(顺序队列 循环队列 链队列)
- MTC系列微波治疗仪
- 计算机配置时间怎么查,电脑怎么查看系统安装日期 查询电脑系统安装日期及系统运行时间的方法...
- 2022中国情侣分手报告:一半男生不删前任微信,是想复合吗?
- C++左值和右值,左值引用和右值引用
- 浏览器自定义滚动条样式
- java计算机毕业设计家政服务管理系统源码+mysql数据库+系统+lw文档+部署
- 嵌入式 QT 基于mplayer的音乐播放器
- 【尚硅谷前端html+css】02_css
- 6.0 动态数码管 _ [AT89C51/2] [从零开始的单片机]