在我的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 }}等。
答案 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;
}