将 http json 响应转换为自定义类
Posted
技术标签:
【中文标题】将 http json 响应转换为自定义类【英文标题】:convert http json response to a custom class 【发布时间】:2022-01-22 19:26:33 【问题描述】:我是 Laravel 和 php 的新手。我有一个简单的问题要问。
我使用 Larave 的 Http client 从另一个服务获取数据。成功得到响应后,我访问了一个属性,我们称之为foo
。在 JSON 响应中,它看起来像这样:
"foo": "abc",
"bar": "abc123"
我的代码:
$response = Http::post('http://another-service.com/data', [
'user_id' => 'Steve'
]);
$responseObject = $response->throw()->object();
$value = $responseObject->foo
我可以访问来自$response
的值,例如$responseObject->foo
。我这里没问题。
但我的代码分析工具 (PhpStan) 会发出警告 Access to an undefined property object::foo
。我明白它为什么会抱怨,因为responseObject
只是一个object
,它的属性不清楚。
我想要一个可以映射到响应 json 的自定义类,但我不想使用 Eloquent,因为 json 对象不需要映射到数据库模型。实现我需要的正确方法是什么?
我试过了:
class MyData
public string foo;
public string bar;
然后:
$responseObject = (MyData) $response->throw()->object();
但它不起作用。 (我是Java背景)
【问题讨论】:
在某些情况下,如果您对对象执行此操作,则必须访问未定义的属性。例如。新的 MyData($responseObject->foo, $responseObject->bar);如果您通过构造函数设置 em。为了避免出现错误,您可以将对象转换为数组,像这样访问它。这不会触发类型检查,因为数组不能这样定义。 但是$responseObject->foo, $responseObject->bar
已经产生了同样的错误,不管你把它传递到哪里。关于将对象隐蔽到数组,能否提供代码sn-p来说明?
如前所述,如果您想使用对象包装到其他对象中,则无法避免出现未定义的属性错误。你用的是 larastan 吗?
是的。现在我改为数组(我不知道这样的选项),错误消失了。谢谢。
补充说希望你能接受它
【参考方案1】:
为避免Larastan
出错,您可以将数据更改为数组。幸运的是 PHP 可以在对象和数组之间进行转换,只需要一个类型提示。
$yourArray = (array) $yourObject;
$yourObject = (object) $yourArray;
我不确定的另一个解决方案是将对象键入到stdClass
。但是 github/laracasts 的问题表明将类型更改为stdClass
,也可能有助于解决问题。
/** @var \stdClass $responseObject **/
$responseObject = $response->throw()->object();
【讨论】:
我解决问题的方法是$response->throw()->json()
以上是关于将 http json 响应转换为自定义类的主要内容,如果未能解决你的问题,请参考以下文章
将 GET 响应从 restTemplate 转换为自定义类