我寫了一些Perl類(包),它有一個方法來回傳一個JSON化的物件呈現(即:一個JSON字串)。 在重構時,我的類使用了來自另一個類的物件,我不得不調整原來的JSON回傳方法。
我的舊類使用了這樣一個輔助函式:
我的舊類使用了這樣一個輔助函式:
use JSON。
sub _JSON_string($)
{
my $data = shift;
my $JSON = JSON->new(); # JSON 編碼器
$JSON->utf8(1)。
$JSON->allow_blessed(1)。
$JSON->convert_blessed(1)。
if ($#_ >= 0 && $_[0] ) {
$JSON->縮進(1)。
$JSON->indent_length($_[0])。
}
return $JSON->encode($data);
}
額外的可選引數是用于漂亮的列印(正如你可能已經猜到的)。 而實際的 "JSONizer "看起來是這樣的:
sub JSON_string($;$)
{
my $self = shift;
my $hash = ...。
return _JSON_string($hash, $_[0);
}
在里面使用的物件中,我寫了這段代碼來進行JSONize:
在里面使用的物件中,我寫了這段代碼來進行JSONize:
use JSON;
sub TO_JSON($)
{
my $self = shift;
my $JSON = JSON->new(); # JSON 編碼器
$JSON->utf8(1)。
$JSON->allow_blessed(1)。
$JSON->convert_blessed(1)。
return $JSON->encode({ ... })。
}
基本來說,這個方法是可行的,但是我想以某種方式將 "pretty-print "傳遞給TO_JSON。
最簡單的解決方案是將原始的JSON物件從包含類中傳遞給TO_JSON,但這并不可行(不允許額外的引數)。
因此,我似乎需要將JSON物件從外部物件傳遞給內部物件,以便使用共同的輸出樣式。
副問題。
為什么我需要在TO_JSON里面設定allow_blessed(1)和convert_blessed(1)?
該物件沒有進一步的祝福組件(...僅由祝福物件內部的組件組成,它們只是數字、字串或undef)。
示例資料
(簡化了,只是為了顯示其結構) 我的物件的資料是陣列,而不是哈希值:
DB<3> x $mp
0 MonitoringParser=ARRAY(0x8e57c0)
0 0
1 'OK'/span>
2 '/etc/group: alpha=0.125, ...'
4 HASH(0x1411608)
'avg'/span> => PerfData=ARRAY(0x1364ca0)
0'avg'
1 0.00145.
2 undef.
3 undef
4 undef
5 0
6 undef
'exp_avg' => PerfData=ARRAY(0x12c6c80)
0'exp_avg'
1 0.00052.
2 undef.
3 undef
4 undef
5 0
6 undef
'last' => PerfData=ARRAY(0x1549e50)
0 'last'
1 0.00051.
2 undef.
3 undef
4 undef
5 0
6undef
DB<6> x $mp->perf_data->{'avg'}。
0 PerfData=ARRAY(0x1364ca0)
0 'avg'/span>
1 0.00145.
2 undef.
3 undef
4 undef
5 0
6undef
DB<7> x $mp->perf_data->{'avg'}-> as_string
0 'label="avg", value=0.00145, unit=<undef> , warn=<undef> , crit=<undef> , min=0, max=<undef> '
因此,主物件是MonitoringParser,它在槽4有一個性能資料的哈希反射。
散列值是PerfData物件(也是陣列)。
我的物件有一個as_string方法,可以從物件中做出一個人類可讀的表述。
正如你所看到的,陣列槽每個都有一個 "圖例"(標簽)。
我希望 JSON 演示也有這些標簽,所以我想從陣列中即時建立一個哈希,將鍵添加到值中(標簽可通過類常量作為陣列使用)。
uj5u.com熱心網友回復:
TO_JSON需要回傳一個資料結構來進行序列化,并且它將被序列化為使用該序列化器的格式化選擇/選項。
它本身通常不是一個JSON字串。當它是JSON字串時,你最終會得到雙重編碼的JSON,正如你已經發現的那樣。這損害了可讀性和可用性。
您希望 JSON 序列化器能夠簡單地嵌入您的字串,這完全沒有意義。你不能在 JSON 檔案中插入任意的字串。雖然您的字串也是 JSON,但它可能與嵌入其中的檔案不兼容。設定上的差異很容易導致一個無效的檔案并破壞事情。
uj5u.com熱心網友回復:
正如@ikegami的回答中提到的,你應該從TO_JSON()回傳一個資料結構。下面是一個例子,我只是將一個陣列的祝福參考轉換為一個包含相同資料的簡單陣列:
use feature qw(say)。
use strict;
使用警告。
use JSON;
my $JSON = JSON->new();
$JSON->utf8(1)。
$JSON->allow_blessed(1)。
$JSON->convert_blessed(1)。
my $data = {
foo => "bar"/span>,
a => [1, 2, {c => 4}] 。
hash => { avg => PerfData->new( 'avg'/span>, 0.00145 ) }
};
my $json = $JSON->encode($data);
say $json;
package PerfData。
use feature qw(say);
use strict;
使用警告。
sub new{
my ( $class, @args ) = @_;
return bless [@args], $class;
}
sub TO_JSON {
my $self = shift;
return [@$self];
}
輸出:
{"a"/span>:[1,2,{"c"/span>: 4}],"hash":{"avg":["avg",0. 00145]},"foo":"bar"}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311349.html
標籤:
上一篇:bash 如何從rpm中獲取版本
