是否有一种方法可以将JsonSerializable对象作为数组参数传递?

问题描述 投票:0回答:2

我正在更新REST Api类;在每个方法的末尾,我必须调用DoResponse方法将作为第一个参数传递的数据转换为JSON字符串。

作为要求的一部分,我为每个端点创建了响应对象;所有这些对象都实现\JSONSerializable

class CustomResponseObject implements JsonSerializable {
    public function jsonSerialize() {
        return [/*...*/];
    }
}

然后我在Api方法中实例化那些对象,并将其传递给DoResponse函数。

function myApiEndpoint() {
    $res = new CustomResponseObject();
    /*...*/
    return $this->DoResponse($res);
}

问题是,所述方法仅接受数组作为第一个参数。

public function DoResponse(array $response = array());

我可以通过传递$res->jsonSerialize()来解决此问题,但是有一种方法可以在将对象传递给DoResponse函数时自动对其进行jsonSerialize,而无需更改底层方法?

php php-7 php-7.3
2个回答
0
投票

JsonSerializable对象转换为数组的穷人方法是:

function myApiEndpoint() {
    $res = new CustomResponseObject();
    /*...*/
    return $this->DoResponse(json_decode(json_encode($res), true););
}

但是出于性能方面的原因,我建议您在响应对象上实现toArray方法,如果性能存在问题,可以更有效地执行此操作


0
投票

Serializing To JSON

要将模型转换为JSON,应使用toJson方法。与toArray一样,toJson方法是递归的,因此所有属性和关系都将转换为JSON。您还可以指定JSON编码选项supported by PHP

return Response::json($res->toArray());

创建响应时,它将负责将对象转换为其jsonSerializable表示形式,这是Eloquent在内部通过调用toArray()来完成的。对于简单array或通用ArrayObjectJsonableCollectionsModels)的内容,就会发生这种情况。

[通常正确的方法是将content-type标头设置为application/json,并确保内容为有效的JSON。如果您遵循REST标准,则还请提供适当的HTTP RESPONSE CODE

© www.soinside.com 2019 - 2024. All rights reserved.