将 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 转换为自定义类

如何将自定义 json 转换为自适应卡片 json 格式

如何在喷雾中将所有拒绝转换为自定义 json?

将 JSON 转换为自定义对象时出错

当 minifyEnabled 为 true 时,如何将 JSON 字符串转换为自定义对象?

将 pandas 数据框转换为自定义 JSON 格式(然后转换为 JS 对象)