DEV Community

David Aprilio
David Aprilio

Posted on

Float jadi Integer? JSON Zero Fraction | Laravel

di laravel ketika kamu mereturn array pada controller/handler akan otomatis di konversi ke json

Route::get('/prices/bnb', function() {
    return [
        'symbol' => 'BNB',
        'price_in' => 'USD',
        'price' => 573.53
    ];
});
Enter fullscreen mode Exit fullscreen mode

responnse:

{
  "symbol": "BNB",
  "price_in": "USD",
  "price": 573.53
}
Enter fullscreen mode Exit fullscreen mode

namun masalah terjadi jika harga menjadi 573.0 laravel akan merubah type data yang awalnya float ke int menjadi 573

Route::get('/prices/bnb', function() {
    return [
        'symbol' => 'BNB',
        'price_in' => 'USD',
        'price' => 573.0
    ];
});
Enter fullscreen mode Exit fullscreen mode

response:

{
  "symbol": "BNB",
  "price_in": "USD",
  "price": 573
}
Enter fullscreen mode Exit fullscreen mode

ini tidak akan menjadi masalah pada bahasa dinamic type seperti JS, PHP dll namun saat sisi client menggunakan bahasa static type misal Golang atau Dart ini cukup merepotkan mereka, ya meskipun bisa di atasi dari sisi bahasa static type tapi cukup meyebalkan.

cara yang paling mudah untuk menangani masalah adalah mengatur flag JSON_PRESERVE_ZERO_FRACTION ketika membuat json

Route::get('/prices/bnb', function() {
    return response()->json([
        'symbol' => 'BNB',
        'price_in' => 'USD',
        'price' => 573.0
    ], 200, [], JSON_PRESERVE_ZERO_FRACTION);
});
Enter fullscreen mode Exit fullscreen mode

ini akan mempertahankan nilai float pada nilai float yang belakangnya 0 (x.0)

namun jika terlalu banyak endpoint yang harus menerapkan JSON_PRESERVE_ZERO_FRACTION akan cukup repot juga, tenang jawabannya adalah middleware, ya cukup ubah aja nilai json sebelum di laravel mengembalikan response.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\JsonResponse;

class BeforeResponse
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return \Illuminate\Http\Response
     */
    public function handle($request, Closure $next)
    {
        /** @var \Illuminate\Http\Response */
        $response = $next($request);
        if ($response instanceof JsonResponse) {
            $response->setJson(json_encode(
                value: $response->getOriginalContent(), 
                flags: JSON_PRESERVE_ZERO_FRACTION
            ));
        }

        return $response;
    }
}
Enter fullscreen mode Exit fullscreen mode

middleware ini mengecek jika response berupa JsonResponse maka akan mengambil nilai originalnya dan melakukan decode sendiri dengan flag JSON_PRESERVE_ZERO_FRACTION

Top comments (0)