在Laravel API资源中返回数组,而无需重新排序键

时间:2018-10-02 17:19:33

标签: laravel

在我的API中,我将资源用于所有端点。在大多数情况下,我返回的是数据数组,它们工作得很好。但是,对于几个端点,我有一些看起来像以下数据的数据:

[
  "123" => ["total"=>123, "average"=>12.7],
  "456" => ["other"=>"data"],
]

,其中键是API已经提供的其他对象的ID。但是,当我将该数据发送到资源时,响应实际上将数据转换为一个直线数组,因此JSON表示如下:

[
  ["total": 123, "average": 12.7],
  ["other": "data"]
]

我想这更多是引擎盖下json_encode的问题,但是我可以在toArray()方法中做些什么来保留键(当它们是数字字符串时)吗?到目前为止,对我而言唯一有效的方法是在对象的前面加上一个非数字字符串键(例如dummy),或者在每个键前添加一个字母(例如a123,{{1 }}等。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Laravel的集成JSON转换器从控制器发送回响应:

$toJson = [
      "123" => ["total"=>123, "average"=>12.7],
      "456" => ["other"=>"data"],
 ];
 return response()->json($toJson);

这将成功返回如下所示的JSON:

{
  '123': {
    total: 123,
    average: 12.7,
  },
  '456': {
    other: "data",
  },
}

答案 1 :(得分:1)

有点晚了,但对于遇到同样问题的人,您可以立即执行此操作:

class MyCustomResource extends JsonResource
{
    /**
     * Keep resource keys as they are.
     * If set to `false` (default), the JsonResource's filter will flatten the array/collection without numerical keys
     *
     * @var boolean
     */
    protected $preserveKeys = true;
}