如何使用HTTPful获取JSON数据时获得数组而不是对象

4
我正在使用HTTPful来发送PHP请求并获取JSON数据,但是该库将结果转换为对象,而我希望结果是一个数组。换句话说,它执行了json_decode($data) 而不是json_decode($data, true)。
据说有一种方法可以使用后者,但我找不到它的位置。该选项在v0.2.2中添加:
- FEATURE Add support for parsing JSON responses as associative arrays instead of objects

但我已经阅读了文档,甚至源代码,但我没有在任何地方找到这个选项...我唯一想到的办法是制作我自己的MimeHandlerAdapter,它执行json_decode($data, true),但如果有某个选项存在的话,这种方式似乎是相当低效的...

我建议对此进行改进:https://github.com/nategood/httpful/issues/151 - nick fox
3个回答

3
可能有点晚回答,但使用Httpful时我进行了一些研究并找到了答案。Httpful为每种MIME类型使用默认的处理程序集。如果在发送请求之前注册一个处理程序,它将使用您注册的处理程序。方便的是,有一个名为Httpful\Handlers\JsonHandler的类。构造函数接受一个参数数组。它只使用其中一个参数$decode_as_array。因此,您可以像这样使其返回一个数组:
// Create the handler
$json_handler = new Httpful\Handlers\JsonHandler(array('decode_as_array' => true));
// Register it with Httpful
Httpful\Httpful::register('application/json', $json_handler);
// Send the request
$response = Request::get('some-url')->send();

更新

我发现如果你没有告诉请求响应的格式是JSON,它有时候会把响应解析成一个奇怪的数组。虽然文档说它应该自动工作,但我还是遇到了一些问题。因此,如果你得到了奇怪的输出,请尝试显式地告诉请求响应格式是JSON,就像这样:

$response = Request::get('some/awesome/url')
    ->expects('application/json')
    ->send();

从自动生成的文档中并不明显,因为变量只被称为 $args。http://phphttpclient.com/docs/source-class-Httpful.Handlers.JsonHandler.html#9 - nick fox

2

我从未使用过这个库。但在研究中,我发现您可以在src / Httpful / Handlers / JsonHandler.php的第11行找到此选项。

您将看到:

private $decode_as_array = false;

这个标志也在同一个文件的第27行使用:

$parsed = json_decode($body, $this->decode_as_array);

但是除了修改库源代码之外,我如何使用这个选项? - Dreen
我不知道你的库是如何工作的。所以,另一个开发者可能比我更能帮助你。但我认为,如果你将$decode_as_array的权限更改为public,你就可以自由地以两种方式操纵它。 - João Paulo de Lima
我也被同样的问题困扰,所以我使用一个名为 stdclass_to_array 的函数来过滤 $response->body:https://gist.github.com/kaorukobo/9267221#file-stdclass_to_array_with_json_encode_decode_for_httpful-php - kaorukobo

1

您需要将 decode_as_array 设置为 true 值,方法如下:

\Httpful\Httpful::register(\Httpful\Mime::JSON, new \Httpful\Handlers\JsonHandler(array('decode_as_array' => true)));

Request::get 调用之前


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接