所以我在

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相关推荐

  1. Jquery 将表单序列化为Json对象

    大家知道Jquery中有serialize方法,可以将表单序列化为一个"&"连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有 ...

  2. JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

    JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...

  3. js对象序列化为json字符串

    网上找了找将js对象序列化为json字符串的方法.结果都不近人意,最后自己写了一个. 注意你得自己为Date增加toString()方法. function Serialize(obj){switch ...

  4. C# 对象序列化之序列化为Json文件(一)

    目录 1.概念 1.1原理 1.2用途 1.3 JSON序列化 1.4 二进制和XML序列化 2. 序列化为JSON 2.1 简单的序列化 2.2 复杂的序列化 3 忽略属性 3.1 忽略单个属性 3 ...

  5. 将Roaring Bitmap序列化为JSON

    近期在实现一个数据结构时使用到了位图索引(bitmap index)[1],本文就来粗浅聊聊位图(bitmap). 一. 什么是bitmap 位图索引使用位数组(bit array,也有叫bitset ...

  6. python 数据库查询序列化_python-将sqlalchemy类序列化为json

    我正在尝试将sqlalchemy查询的结果(列表)序列化为json. 这是课程: class Wikilink(Base): __tablename__='Wikilinks' __table_arg ...

  7. Newtonsoft.Json.dll序列化为json,null值自动过滤

    Newtonsoft.Json.dll序列化为json,null值自动过滤 原文:Newtonsoft.Json.dll序列化为json,null值自动过滤 var jSetting = new Js ...

  8. 关于DateTime对象序列化为Json之后的若干问题

    将Datetime对象序列化成Json对象是常有的事情,微软的序列化方法会将Datetime对象序列化成一个字符串: "\/Date(1234656000000)\/" 这样的字符 ...

  9. Python: 自定义类对象序列化为Json串

    之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonToolclass Score:math = 0c ...

最新文章

  1. 一场事先预告的砸冰箱盛宴
  2. 什么是codepage?
  3. 【Flask】Jinja2之模板继承
  4. MQTT再学习 -- 漫谈MQTT协议
  5. 使类和成员的可访问性最小化
  6. es6 --- Promise封装读取文件操作
  7. img=img%3e128 matlab,Matlab中一般的数值计算和使用
  8. ibatis 中 $与#的区别
  9. SpringBoot整合Mybatis-plus实现增删查改
  10. 计算机专业理科二本录取分数线,这7所211理科录取分数线较低,普通考生记得关注,2所有二本招生...
  11. activiti流程变量
  12. 5.5 Transformers的改进--自适应Attention
  13. 关于left join 一些测试
  14. 笔记本和android分屏,如何把Android/IOS手机或者平板作为PC电脑显示器的分屏
  15. DevIL的学习笔记
  16. 关于arduino驱动SH1106 OLED屏幕使用U8g2库显示案例
  17. HTML5输入框里加图片代码,做了一个input上传加号框,图片上传后显示在框中,怎么让加号消失?...
  18. 时空之巅服务器在线玩,天域之巅 - 《神鬼传奇》官方网站
  19. 【深度学习图像识别课程】毕业项目:狗狗种类识别(1)环境准备
  20. java zmq订阅_java zmq消息队列

热门文章

  1. 数据结构 队列(顺序队列 循环队列 链队列)
  2. MTC系列微波治疗仪
  3. 计算机配置时间怎么查,电脑怎么查看系统安装日期 查询电脑系统安装日期及系统运行时间的方法...
  4. 2022中国情侣分手报告:一半男生不删前任微信,是想复合吗?
  5. C++左值和右值,左值引用和右值引用
  6. 浏览器自定义滚动条样式
  7. java计算机毕业设计家政服务管理系统源码+mysql数据库+系统+lw文档+部署
  8. 嵌入式 QT 基于mplayer的音乐播放器
  9. 【尚硅谷前端html+css】02_css
  10. 6.0 动态数码管 _ [AT89C51/2] [从零开始的单片机]