27
2020
05

Laravel API返回json key下划线转驼峰

mysal数据库里很多字段都是有下划线的,在写api时经常会用到直接用字段名当作key直接返回json的情况

大部分情况下是没有问题的。但在一些情形下,比如,iOS的json 转成NSDictionary 时,会出现有下划线的key,都会被加上双引号,这会导致续的解析问题。要解决这个情部况,就需要把下划线去掉。我们可以统一在返回json时,就把key里的下划线转成驼峰格式

以Laravel API为例:

我们可以写一个自定义的中间件来完成这个工作

  1. 通过php artisan make:middleware ResponseTransFormMiddleware命令,会在 app/Http/Middleware下自动生成ResponseTransFormMiddleware文件

  2. 修改ResponseTransFormMiddleware文件,实现下划线转驼峰功能

//下划线转驼峰
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        //return response()->json($response->original);

        return response()->json($this->changeHump($response->original));
    }


    //转换驼峰(只转key)
    public function changeHump($params)
    {
        if (is_array($params)) {
            foreach ($params as $key=>$value){
                unset($params[$key]);
                $params[$this->convertUnderline($key)] = is_array($value)?$this->changeHump($value):$value;
            }
        }
        return $params;
    }

    public function convertUnderline($str)
    {
        return  preg_replace_callback('/([-_]+([a-z]{1}))/i', function ($matches) {return strtoupper($matches[2]);}, $str);
    }


3. Kernel.php中添加路由中间件

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    
    'responseTransForm' => \App\Http\Middleware\ResponseTransFormMiddleware::class, //下划线转驼峰

];

4.最后一步,定义路由

Route::group(['middleware' => ['responseTransForm']], function() {

    Route::post('register', 'Auth\RegisterController@apiregister');
    Route::post('login', 'Auth\LoginController@apilogin');
});


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。