msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

10 Oct 11 JsonSerializable接口

昨天funlake提醒了我, 应该把一些PHP的新动向传播一下.

恭喜候鸟加入了pdt,有什么新进展别忘了给咱cn phper通报一下呀。

那么, 今天为大家介绍一下5.4中对Json做的一个改进.

Json是Ajax应用中最为通用的数据传输格式(协议), 主流的编程语言都带有对Json的支持, 在PHP中, 有json_encode/json_decode, 可以很方便的构造Json数据格式.

<?php
echo json_encode(array(1,2,3,4));
?>

//[1,2,3,4]

也可以Json化一个对象:

<?php
$o = new stdclass;
$o->a = 42;
echo json_encode($o);
?>

//{"a":42}

但这样就有个问题, 现实生活中的对象是很复杂的, Json的这种默认只对属性做操作的做法有的时候是不能解决问题的, 比如我们希望通过私有成员来做一些计算得到最后的Json化数据, 又或者我们希望用一个字符串来代替一个object.

在以前, 那你只能自己拼凑Json串了. 不过感谢Sara, 在5.4中, Json新增了一个JsonSerializable接口, 任何实现了这个接口的类, 需要定义一个jsonSerialize()方法, 这个方法会在对这个类的对象做Json化的时候被调用, 这个时候你就可以在这个方法内 , 随意调整最终的Json化的结果:

<?php
class JsonTest implements JsonSerializable {
    private $a, $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function jsonSerialize() {
        return $this->a + $this->b;
    }
}

echo json_encode(new JsonTest(23, 42));
?>

//65

下面是个稍微复杂点的例子:

<?php
$data = array(
    new stdClass();
    new JsonTest(1,2),
    new JsonTest(3,4),
    array(5,6)
);
echo json_encode($data);
?>

//[{},3,7,[5,6]]

最后提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 这些特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.

谢谢

PS: 这个特性最初由Johannes在他自己的blog中介绍: http://schlueters.de/blog/archives/135-Jason,-let-me-help-you!.html


分享到:



Related Posts:

Tags: , , , , ,

11 Responses to “JsonSerializable接口”

  1. samsung galaxy aero armor |

    Fabulous, what a blog it is! This website presents useful data
    to us, keep it up.

  2. Edwardo |

    Appreciate this post. Let me try it out.

    webpage – Edwardo -

  3. matingintelligence |

    Alan Griswold: Rumen Kolev’s Placidus and Delphic
    Oracle 5. * enhanced corporate efficiency and new communications clarity;.
    This restricts the kind and type of TV shows that networks like
    FOX, CNN, CBS, NBC and ABC can broadcast.

  4. PHP & “Data” URL scheme | 午后小憩 |

    [...] JsonSerializable接口 [...]

  5. cnbtmovie |

    PHP 的语法越变越复杂了.
    是否开控制下?

  6. [转] PHP5.4新特性小结 | 雕刻时光-海量热帖 |

    [...] 参考:http://www.laruence.com/2011/10/10/2204.html [...]

  7. 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » PHP & “Data” URL scheme |

    [...] JsonSerializable接口 [...]

  8. PHP5.4新特性 | 喵了个咪 |

    [...] 6. JsonSerializable Interface 实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。 参考:http://www.laruence.com/2011/10/10/2204.html [...]

  9. PHP5.4新特性小结 | 实践.最佳 - 行.思.悟 |

    [...] 参考:http://www.laruence.com/2011/10/10/2204.html [...]

  10. wynn |

    定义标准化interface的意义远超过单纯的实现某个功能。

    比如说原本某处有段代码是:
    $o = new myClass();
    /* do something */
    echo json_encode($o);
    后来因为某种原因,myClass的某个属性被移除,改为计算得出,那么只要改一改myClass的定义,实现JsonSerializable接口,并实现jsonSerialize方法即可,其他地方都不需要变动。

    如果用自定义某个方法的方式来实现同样的功能(比如就叫_jsonSerialize),那么在初期就要给所有需要被json化的对象定义此方法(具体内容很可能就是简单的 return $this;),平白增加了复杂度,降低了效率。

    所有开发人员都遵循一样的标准,也会让程序的沟通维护更加简单。

  11. wclssdn |

    感觉也不是很有用. 既然encode的时候写了对象. 那干嘛不直接调用对象的一个方法呢?比如就叫_jsonSerialize…

Leave a Reply

*