如何在php中覆盖json_encode()功能以将空值替换为“”

时间:2018-12-19 06:03:44

标签: php

对于我使用的输出,我已经使用php编程创建了全部api

PROCEDURE GEN_EXCEL IS

 IN_FILE TEXT_IO.FILE_TYPE;
 VC_HEAD Varchar2(32000);
 vc_file_path Varchar2(50) := 'C:\';

BEGIN

 IN_FILE := TEXT_IO.FOPEN(vc_file_path||'Test'||'.CSV','W'); 
 TEXT_IO.PUT_LINE(IN_FILE,'YOUR_TITLE'||chr(10));
 VC_HEAD := 'header1,header2,header3,header4';

 TEXT_IO.PUT_LINE(IN_FILE,VC_HEAD);
 FOR C1 IN ( SELECT column1, column2, column3, column4
             FROM Table_name)
 LOOP
   TEXT_IO.PUT_LINE(IN_FILE,C1.col1||','||C1.col2||','||C1.col3||','||C1.col4);

 END LOOP;

 TEXT_IO.FCLOSE(IN_FILE);
 MESSAGE('Excel file has been created!');
 MESSAGE('Excel file has been created!');

 EXCEPTION
  WHEN Others THEN
 TEXT_IO.FCLOSE(IN_FILE);
 MESSAGE('Error while writing file.');
 MESSAGE('Error while writing file.');
 END;

现在我想通过将null替换为“”来打印输出。

我已经使用json_encode($ arr)完成了400多个Web服务的输出,但是我不想更改为

任何身体都可以帮助

我的实际数组

json_encode($arr)

echo json_encode($ array); //输出:

$array=array("id" => "2",
"name" => "Test Name",
"address" => "83 Test Street",
"city" => "Test",
"phone" => "(123) 456-7890",
"video_thumb" => null,
"thumbnail" => null,
"description" => null);

期望输出 //输出

{"id":"2",
"name":"Test Name",
"address":"83 Test Street","city":"Test","phone":"(123) 456-7890","video_thumb":null,
"thumbnail":null,
"description":null
}

4 个答案:

答案 0 :(得分:0)

此代码帮助我解决了该问题,而无需修改所有服务

ob_start(function($json) {
    function json_validator($data = NULL) {
        if (!empty($data)) {
            json_decode($data);
            return (json_last_error() === JSON_ERROR_NONE);
        }

        return false;
    }

    if (json_validator($json)) {
        $response_arry = json_decode(str_replace('null', '""', $json));
        if (json_last_error_msg() == "Syntax error") {
            $response_arry = json_decode(str_replace('"null"', '""', $arr));
        }
        return json_encode($response_arry, JSON_PRETTY_PRINT);
    } else {
        return ob_get_contents();
    }
});

答案 1 :(得分:0)

这个想法是使用override_function来“修改” json_encode函数。在调用此函数之前,可以修改数组,使其满足一个空字符串而不是null。 您可以尝试以下方法:

rename_function('json_encode', 'override_json_encode' );
override_function("json_encode", '$array', 'return override_json_encode($array);' );


function override_json_encode($array){
    foreach ($array as &$value) {
        if ($value === null) 
             $value = "";
    }
return json_encode($array);
}

}

答案 2 :(得分:-1)

$array = array("id" => "2",
    "name" => "Test Name",
    "address" => "83 Test Street",
    "city" => "Test",
    "phone" => "(123) 456-7890",
    "video_thumb" => null,
    "thumbnail" => null,
    "description" => null
);

array_walk_recursive($array, function(&$item){
    if(is_null($item)) $item = '';
});

echo json_encode($array);

输出

{"id":"2","name":"Test Name","address":"83 Test Street","city":"Test","phone":"(123) 456-7890","video_thumb":"","thumbnail":"","description":""}

Sandbox

如果必须调用400次,只需将其包装在一个函数中即可。像这样装饰普通的json_encode:

function my_json_encode($value,$options=0,$depth=512){
     array_walk_recursive($value, function(&$item){
        if(is_null($item)) $item = '';
     });

     return json_encode($value,$options,$depth);
}

通过这种方式,您可以访问常规方法的所有选项和功能,但有一点点更改。核心功能没有“覆盖”,也没有覆盖类方法的方式。功能只能定义一次,然后才能设置。

答案 3 :(得分:-1)

哦,明白你的意思。请查看以下文件: http://php.net/manual/en/ref.apd.php 重命名功能和替代功能