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 ?

7076 次点击
所在节点    PHP
41 条回复
akrf
2017-07-25 01:23:12 +08:00
老太婆,你还记不记得有一招从天而降的掌法?
oh
2017-07-25 01:26:05 +08:00
imxieke
2017-07-25 01:26:50 +08:00
没太整明白帖子意思
不过转成数组的话可以 先将 json 转换成数组 然后用 foreach
关注 等待大佬解答
akrf
2017-07-25 01:26:58 +08:00
@oh 别这么耿直嘛。

言归正传,楼主试过直接 json_decode 嘛?
akrf
2017-07-25 01:27:29 +08:00
@imxieke 楼主是其他语言的程序员,正在 PHP 入门……
RobberPhex
2017-07-25 01:34:16 +08:00
json_decode 是 str 到 array,这个根本不是问题的重点。

str 到某个特定的类的转换呢? json 中的 key 对应到 object 中的属性,有存在且为原生类型、存在且是另外一个类型(即嵌套)、不存在该字段。这三种情况如何用比较少的代码来处理。
RobberPhex
2017-07-25 01:37:23 +08:00
Go 中,可以通过类的属性标签来指示如何从 json 中反序列化出来。php 好像没法添加?
feiyuanqiu
2017-07-25 01:56:44 +08:00
… json_decode 转 json 对象,默认就是转成 stdClass 对象

至于你的要求,你这个 json 字符串又没有带类型信息,php 怎么可能知道要转成哪个类型?别什么问题都赖语言,go 在 unmarshal 的时候也要求你把要转换的类型传进去它才知道该转成什么的

想实现你的需求,要么别用 json 用序列化;要么自己定义一个类似于 go 的 Marshalable 接口,直接继承 JsonSerializable 接口,自己实现一个通用的 unmarshal 方法,将 json 解析出来的数据初始化到具体对象
akrf
2017-07-25 02:21:03 +08:00
@RobberPhex 第一句话就错了。慢慢学习吧…
cxbig
2017-07-25 05:53:05 +08:00
从来就不会用也不期待这样开放性的转换,一定是先定义好 class 和其中的 attribute 和 method,再把数据丢进去处理。
syncher
2017-07-25 07:48:56 +08:00
torbrowserbridge
2017-07-25 08:05:30 +08:00
楼主你连主题中的第一个 json 都没写对(多了一个结尾的逗号)
jhdxr
2017-07-25 09:01:49 +08:00
没人发现 LZ 的 json 是 {"a":"b", "c": "d"},但类的两个属性却是$a 和$b 么。。。谁能告诉我这个转换规则是什么?
aksoft
2017-07-25 09:05:18 +08:00
@jhdxr 高级黑
eoo
2017-07-25 09:06:33 +08:00
json_decode 不就是对象了吗?
Tokin
2017-07-25 09:11:45 +08:00
好奇,json_decode(jsonStr)不是对象吗? json_decode(jsonStr,true)才是数组不是吗?我去试试- -
Tokin
2017-07-25 09:25:14 +08:00


感觉没什么问题,直接 json_decode 很正确啊
sagaxu
2017-07-25 09:39:38 +08:00
自己实现吧,phper 一般不这么玩,他们用 stdClass 和 array
xzem
2017-07-25 09:41:04 +08:00
phper 表示这种情况不用 json_decode 自己瞎折腾啥啊。 我还觉得强类型语言的 json 反序列化难受呢。
Tokin
2017-07-25 09:42:12 +08:00
@RobberPhex json_decode 并不是 str 到 array。。。

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

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

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

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

© 2021 V2EX