PHP 如何将 json 转换为对象?

2017-07-25 00:56:46 +08:00
 RobberPhex

比如

{
  "a": "b",
  "c": "d",
}

需要转化为类:

class A {
  public $a;
  public $b;
}

我想到的方案如下:

  1. 添加 props 属性
class A {
  public $a;
  public $b;
  const props = [
    'a',
    'b'
  ];
}

但是这样一来,信息就比较冗余了。

  1. 动态添加属性
class A {
  const props = [
    'a',
    'b'
  ];
}

$a 和$b 动态添加给 this。

但是显然,失去了 IDE、静态代码分析工具的支持。


目前我觉得 Go 中的,json.Marshal, json.Unmarshal 还是比较方便的,但是看起来不太适合 PHP ?

7092 次点击
所在节点    PHP
41 条回复
sagaxu
2017-07-25 09:46:36 +08:00
@xzem 强类型的 python,json 反序列化毫无违和感啊
zhongkouwei
2017-07-25 09:48:19 +08:00
摘一段文档:
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
接受一个 JSON 编码的字符串并且把它转换为 PHP 变量。
当 assoc 参数为 TRUE 时,将返回 array 而非 object。
xzem
2017-07-25 09:51:03 +08:00
@sagaxu 哦,我上次用 c#感觉很折腾,可能不熟悉的原因
vus520
2017-07-25 09:55:42 +08:00
java 和 go 过来的,一来就开始写映射,php 里不需要啊老铁,json_decode 就够了,没错,省了 1 个小时的 coding。
jarlyyn
2017-07-25 10:22:05 +08:00
一堆强答的。

曾经也想过这个问题,由于 php 没有类型,没有 go 那样的接口,所以很难实现 go 那么爽的 json 转换。

当然,有一些框架做过一些工作,能起到类似的作用。

如 yii 框架 1.x 为例。

首先 yii 实现了一个 CComponent 的基础组建。

所以所有 yii 的类都有可以用 yii::createCpmponent 方法初始化数组为你想要的类。

这是第一步。

然后,Yii 的数据库和表单的基类都是 CForm

CForm 可以制定每个字段的验证规则

然后通过 setAttriutes 方法,将一个数组的值制定给一个 CForm 类。

最后,我的选择呢,小项目调接口为主的还是走 go,简单多了。
RobberPhex
2017-07-25 10:32:34 +08:00
@jarlyyn 但是这样对外界依赖太多啦,和 yii 绑定确实不好。

看了下,https://github.com/AnujRNair/php-json-marshaller 是一个不错的尝试。
gouchaoer
2017-07-25 10:37:33 +08:00
我个人觉得 php 的 json 操作真的是最简单的了,就用 array 搞定一切
bombless
2017-07-25 10:39:55 +08:00
v2 的 php 水平不太行,哈哈

以前瞎逛 StackOverflow 的时候看过别人的解决方案,比较 hack,大意就是得到 stdClass 实例后 serialize() ,之后去修改那串编码,后面再 unserialize() 回来。当然这样做的前提是你已经知道要转成什么类型了。
jarlyyn
2017-07-25 10:47:22 +08:00
@RobberPhex

方法肯定有很多种。

但为何不在重视这样的项目里直接用 go 呢-____-

有这个需求基本就是做接口接受 json 数据吧,php 本身优势也不大啊。
linoder
2017-07-25 12:00:37 +08:00
json_decode 后需要加方法可以用 php7 Closure::call 多看看 php.net
yzmm
2017-07-25 13:22:59 +08:00
php 的 json 库支持得不够友好,没法直接序列化一个 class 也没法直接反序列化
Balthild
2017-07-25 13:46:58 +08:00
好多人不审题就答……
voocel
2017-07-25 14:26:41 +08:00
我来强答一波...
voocel
2017-07-25 14:27:07 +08:00
为什么叫你老太婆
POPOEVER
2017-07-25 14:35:24 +08:00
类不行的,#31 说得对的,你得自己扩展,或者看看这个 https://github.com/cweiske/jsonmapper
chahualao
2017-07-25 17:16:21 +08:00
我第一眼看标题,啊,这不 json_decode 不就完了吗? 然后楼主思路,啊?我是不是理解错了?啊,难道我学的东西有问题?啊,我要去试一下。。。。。。
erming
2017-07-25 17:51:52 +08:00
@RobberPhex json_decode 是 str 到 array ? 查下手测吧,第二个参数什么意思
junbguistar
2017-07-25 18:26:47 +08:00
看了评论才 get 到楼主的 point
ditel
2017-07-25 19:52:18 +08:00
先转数组,再组合成想要的,再转回 json,再转成 stdclass,估计可以,自己 hack
cnwggu
2017-07-26 13:30:45 +08:00
同意 #35 楼,jsonmapper 可以一试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/377697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX