业务中经常需要对接第三方服务,常用的对接方式就是使用 http json 接口,有些 json 格式较为复杂,使用php数组进行数据交互非常麻烦,非常容易出错。
$responseStr = '{"foo":"bar", "hello":"world"}';
$responseArr = json_decode($responseStr, true);
if($responseArr["fooo"] == "foobar") {
// do sth.
}
现在 IDE 比如 PHPStorm 也不能对数组 进行代码提示,上面的代码是不会有错误提示的;如果把 json 返回值直接映射到预先定义好的对象,岂不是很舒心?
一、映射 json 到 php 对象
我们可以使用 composer 包: stark-object ,支持复杂 json 到 复杂对象之间的映射。
composer require stark641/stark-object
class FooBarClass extends StarkObject
{
/** @var string */
public $foo;
/** @var integer */
public $bar;
}
class DemoClass extends StarkObject
{
/** @var FooBarClass */
public $foobar;
/** @var FooBarClass[] */
public $foobars;
}
$json = '{"foobar":{"foo":"hello world","bar":64100},"foobars":[{"foo":"hello","bar":641},{"foo":"world","bar":664411}]}';
$demo = (new DemoClass())->fromJson($json);
if($demo->foobar->foo == "hello world") {
echo count($demo->foobars);
}
var_export($demo);
输出
2
DemoClass::__set_state(array(
'foobar' =>
FooBarClass::__set_state(array(
'foo' => 'hello world',
'bar' => 64100,
)),
'foobars' =>
array (
0 =>
FooBarClass::__set_state(array(
'foo' => 'hello',
'bar' => 641,
)),
1 =>
FooBarClass::__set_state(array(
'foo' => 'world',
'bar' => 664411,
)),
),
))
下一步,这个工具将会提供直接从 json 生成 php 类代码的辅助功能,将会更大提升对接效率。
。。。
二、解析 json 自动生成 php 类文件
来填坑了,安装好 composer require stark641/stark-object
以后,可以使用脚本 vendor/bin/stark-object-gen
来直接生成代码到指定文件夹。
Usage:
- 示例
$./vendor/bin/stark-object-gen --path=/tmp --json='{"foo_bar":{"foo":1.3,"bar":[641,641]}}'
output
Class FooBar saved at: /tmp/FooBar.php
Class BaseClass saved at: /tmp/BaseClass.php
--help
查看帮助
$./vendor/bin/stark-object-gen --help
output
stark object generator
Usage:
./vendor/bin/stark-object-gen --path=/tmp --json='{"foo_bar":{"foo":1.3,"bar":[641,641]}}'
Flags:
--path path to save class files (存储类文件路径)
--baseClassName base class name (最外层类名)
--fieldCase field case type 0:keep, 1:snake case, 2:camel case (字段形式)
--namespace namespace for class (类命名空间)
--json json input (待解析的json文件)
--help print this help (输出当前帮助信息)