[英]Remove null fields in JSON String in Perl
我正在修改一個Perl腳本,該腳本從各種來源收集一些數據,將它們放入結構化JSON中,並調用傳遞該JSON文件的Web服務。 我在其中某些字段中存在null值問題...
這是我的代碼的片段:
$p->{BAND_ATTEN_DN1} = 'null';
$p->{BAND_ATTEN_DN2} = 'null';
$p->{BAND_ATTEN_DN3} = 'null';
$p->{BAND_ATTEN_DN4} = 'null';
$p->{BAND_ATTEN_UP0} = 'null';
$p->{BAND_ATTEN_UP1} = 'null';
$p->{BAND_ATTEN_UP2} = 'null';
$p->{BAND_ATTEN_UP3} = 'null';
$p->{BAND_ATTEN_UP4} = 'null';
$p->{BAND_SNR_MARGIN_DN1} = 'null';
$p->{BAND_SNR_MARGIN_DN2} = 'null';
$p->{BAND_SNR_MARGIN_DN3} = 'null';
$p->{BAND_SNR_MARGIN_DN4} = 'null';
$p->{BAND_SNR_MARGIN_UP0} = 'null';
$p->{BAND_SNR_MARGIN_UP1} = 'null';
$p->{BAND_SNR_MARGIN_UP2} = 'null';
$p->{BAND_SNR_MARGIN_UP3} = 'null';
$p->{BAND_SNR_MARGIN_UP4} = 'null';
$p->{BAND_SIG_ATTEN_DN1} = 'null';
$p->{BAND_SIG_ATTEN_DN2} = 'null';
$p->{BAND_SIG_ATTEN_DN3} = 'null';
$p->{BAND_SIG_ATTEN_DN4} = 'null';
$p->{BAND_SIG_ATTEN_UP0} = 'null';
$p->{BAND_SIG_ATTEN_UP1} = 'null';
$p->{BAND_SIG_ATTEN_UP2} = 'null';
$p->{BAND_SIG_ATTEN_UP3} = 'null';
$p->{BAND_SIG_ATTEN_UP4} = 'null';
$p->{ATTAINABLE_DN} = 'null';
$p->{ATTAINABLE_UP} = 'null';
$p->{POWER_DN} = 'null';
$p->{POWER_UP} = 'null';
for my $k (keys %$q) {
$p->{$k} = ($q->{$k}) ? $q->{$k} : 'null';
}
my $m = $measure->{$port};
for my $k (keys %$m) {
$p->{$k} = ($m->{$k}) ? $m->{$k} : 'null';
}
my $hlog_up_values = &get_values($delt->{UPHLOG}, 9999, -99);
my $hlog_dn_values = &get_values($delt->{DOWNHLOG}, 9999, -99);
my $qln_up_values = &get_values($delt->{UPQLN}, 9999, -199);
my $qln_dn_values = &get_values($delt->{DOWNQLN}, 9999, -199);
my $snr_up_values = &get_values($delt->{UPSNR}, 9999, -99);
my $snr_dn_values = &get_values($delt->{DOWNSNR}, 9999, -99);
my $hlog_cg_size_dn = grep ($delt->{DOWNHLOGGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{DOWNHLOGGRUOPSIZE} : $delt->{DOWNHLOGGRUOPSIZE}/4.3125;
my $hlog_cg_size_up = grep ($delt->{UPHLOGGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{UPHLOGGRUOPSIZE} : $delt->{UPHLOGGRUOPSIZE}/4.3125;
my $qln_cg_size_dn = grep ($delt->{DOWNQLNGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{DOWNQLNGRUOPSIZE} : $delt->{DOWNQLNGRUOPSIZE}/4.3125;
my $qln_cg_size_up = grep ($delt->{UPQLNGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{UPQLNGRUOPSIZE} :$delt->{UPQLNGRUOPSIZE}/4.3125;
my $snr_cg_size_dn = grep ($delt->{DOWNSNRGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{DOWNSNRGRUOPSIZE} :$delt->{DOWNSNRGRUOPSIZE}/4.3125;
my $snr_cg_size_up = grep ($delt->{UPSNRGRUOPSIZE} eq $_,(1,2,4,8,16)) ? $delt->{UPSNRGRUOPSIZE} : $delt->{UPSNRGRUOPSIZE}/4.3125;
my $pots_line_length_A = defined $plt->{POTS_LINE_LENGTH_A} ? $plt->{POTS_LINE_LENGTH_A} : 'null';
my $pots_line_length_B = defined $plt->{POTS_LINE_LENGTH_B} ? $plt->{POTS_LINE_LENGTH_B} : 'null';
my $pots_line_state = defined $plt->{POTS_LINE_STATE} ? $plt->{POTS_LINE_STATE} : 'null';
my $pots_line_termination = defined $plt->{POTS_LINE_TERMINATION_TYPE} ? $plt->{POTS_LINE_TERMINATION_TYPE} : 'null';
#&_trace("STUB GROUP SIZE",$function, TRC_PDNT);
#$hlog_cg_size_dn = 8;
#$hlog_cg_size_up = 8;
#$qln_cg_size_dn = 8;
#$qln_cg_size_up = 8;
#$snr_cg_size_dn = 8;
#$snr_cg_size_up = 8;
my $json_string = "{
\"attainable_rate\": {
\"down_value\": $p->{ATTAINABLE_DN},
\"up_value\": $p->{ATTAINABLE_UP}
},
\"hlog\": {
\"up_values\": [$hlog_up_values],
\"down_values\": [$hlog_dn_values]
},
\"hlog_cg_size\": {
\"down_value\": $hlog_cg_size_dn,
\"up_value\": $hlog_cg_size_up
},
\"qln\": {
\"down_values\": [$qln_up_values],
\"up_values\": [$qln_dn_values]
},
\"qln_cg_size\": {
\"down_value\": $qln_cg_size_dn,
\"up_value\": $qln_cg_size_up
},
\"snr\": {
\"up_values\": [$snr_up_values],
\"down_values\": [$snr_dn_values]
},
\"snr_cg_size\": {
\"down_value\": $snr_cg_size_dn,
\"up_value\": $snr_cg_size_up
},
\"spectrum\": \"$actual_spectrum\",
\"rtx_status\": {
\"down_value\": [
null
],
\"up_value\": [
null
]
},
\"line_attenuation\": {
\"down_values\": [
$p->{BAND_ATTEN_DN1},
$p->{BAND_ATTEN_DN2},
$p->{BAND_ATTEN_DN3},
$p->{BAND_ATTEN_DN4}
],
\"up_values\": [
$p->{BAND_ATTEN_UP0},
$p->{BAND_ATTEN_UP1},
$p->{BAND_ATTEN_UP2},
$p->{BAND_ATTEN_UP3},
$p->{BAND_ATTEN_UP4}
]
},
\"noise_margin\": {
\"down_values\": [
if($p->{BAND_SNR_MARGIN_DN1},
$p->{BAND_SNR_MARGIN_DN2},
$p->{BAND_SNR_MARGIN_DN3},
$p->{BAND_SNR_MARGIN_DN4}
],
\"up_values\": [
$p->{BAND_SNR_MARGIN_UP0},
$p->{BAND_SNR_MARGIN_UP1},
$p->{BAND_SNR_MARGIN_UP2},
$p->{BAND_SNR_MARGIN_UP3},
$p->{BAND_SNR_MARGIN_UP4}
]
},
\"signal_attenuation\": {
\"down_values\": [
$p->{BAND_SIG_ATTEN_DN1},
$p->{BAND_SIG_ATTEN_DN2},
$p->{BAND_SIG_ATTEN_DN3},
$p->{BAND_SIG_ATTEN_DN4}
],
\"up_values\": [
$p->{BAND_SIG_ATTEN_UP0},
$p->{BAND_SIG_ATTEN_UP1},
$p->{BAND_SIG_ATTEN_UP2},
$p->{BAND_SIG_ATTEN_UP3},
$p->{BAND_SIG_ATTEN_UP4}
]
},
\"transmit_power\": {
\"down_value\": $p->{POWER_DN},
\"up_value\": $p->{POWER_UP}
}
}";
例如(我確定問題僅存在於line_衰減,signal_衰減和noise_margin上下)
\"line_attenuation\": {
\"down_values\": [
$p->{BAND_ATTEN_DN1},
$p->{BAND_ATTEN_DN2},
$p->{BAND_ATTEN_DN3},
$p->{BAND_ATTEN_DN4}
如果$p->{BAND_ATTEN_DN4}
為null
我必須只傳遞前3個值,而不傳遞3個有效值+ 1個null ..如何刪除那些null值? 檢查所有這些字段?
目前我正在使用那些圖書館
use strict;
use Data::Dumper;
use Getopt::Long;
use REST::Client;
use DBI;
use JSON;
如果可能的話,我不想導入其他庫。
我嘗試檢查是否已定義,或者是否將其放入json代碼中但什么也沒有...
謝謝您的幫助
做到這一點的明智方法是使用JSON模塊將您的數據結構轉換為JSON。 我要么逐步建立一個新的Perl數據結構
my $to_json;
$to_json->{foo} = $p->{foo};
if ($p->{bar}) {
$to_json->{baz} = $p->{baz};
}
use strict;
use warnings;
use JSON;
my $p = {
BAND_ATTEN_DN1 => 1,
BAND_ATTEN_DN2 => 2,
BAND_ATTEN_DN3 => 3,
BAND_ATTEN_DN4 => undef,
};
my $to_json = {
line_attenuaion => {
down_values => [
grep defined, map { $p->{$_} }
qw/BAND_ATTEN_DN1 BAND_ATTEN_DN2 BAND_ATTEN_DN3 BAND_ATTEN_DN4/,
],
hashref_slice => [
grep defined,
@{$p}{qw/BAND_ATTEN_DN1 BAND_ATTEN_DN2 BAND_ATTEN_DN3 BAND_ATTEN_DN4/},
],
},
# ...
};
print to_json $to_json;
但是,您說您不能進行大的修改。 您必須拆分輸出JSON的代碼。 這將產生甚至更丑陋的代碼,為維護起見, 我強烈建議不要以這種方式這樣做 。
# HERE BE DRAGONS...
my $json_string = "{
\"attainable_rate\": {
\"down_value\": $p->{ATTAINABLE_DN},
\"up_value\": $p->{ATTAINABLE_UP}
},
\"line_attenuation\": {
\"down_values\": [
$p->{BAND_ATTEN_DN1},
$p->{BAND_ATTEN_DN2},
$p->{BAND_ATTEN_DN3}";
if ($p->{BAND_ATTEN_DN4}) {
$json_string .= ",
$p->{BAND_ATTEN_DN4}";
}
$json_string .= "
]
}
}
";
如果這樣做,那么至少可以通過將字符串的雙引號""
轉換為qq
運算符或使用HEREDOC來擺脫所有轉義。
my $json_string = qq({
"attainable_rate": {
"down_value": $p->{ATTAINABLE_DN},
"up_value": $p->{ATTAINABLE_UP}
}
}
);
my $heredoc = <<JSON
{
"attainable_rate": {
"down_value": $p->{ATTAINABLE_DN},
"up_value": $p->{ATTAINABLE_UP}
}
}
JSON
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.