Perl JSON将所有数字视为字符串

Perl JSON将所有数字视为字符串,json,perl,Json,Perl,为了创建一个与严格类型语言一致的API,我需要修改所有JSON,以返回带引号的字符串代替整数,而无需逐个检查并修改底层数据 现在JSON就是这样生成的: my $json = JSON->new->allow_nonref->allow_unknown->allow_blessed->utf8; $output = $json->encode($hash); “并引用$hash中的每一个标量”是什么好方法呢?JSON的两个后端(JSON::PP和JS

为了创建一个与严格类型语言一致的API,我需要修改所有JSON,以返回带引号的字符串代替整数,而无需逐个检查并修改底层数据

现在JSON就是这样生成的:

  my $json = JSON->new->allow_nonref->allow_unknown->allow_blessed->utf8;
  $output = $json->encode($hash);
“并引用$hash中的每一个标量”是什么好方法呢?

JSON的两个后端(JSON::PP和JSON::XS)都将输出类型基于值的内部存储。解决方案是将数据结构中的非引用标量字符串化

sub recursive_inplace_stringification {
   my $reftype = ref($_[0]);
   if (!length($reftype)) {
      $_[0] = "$_[0]" if defined($_[0]);
   }
   elsif ($reftype eq 'ARRAY') {
      recursive_inplace_stringification($_) for @{ $_[0] };
   }
   elsif ($reftype eq 'HASH') {
      recursive_inplace_stringification($_) for values %{ $_[0] };
   }
   else {
      die("Unsupported reference to $reftype\n");
   }
}

# Convert numbers to strings.
recursive_inplace_stringification($hash);

# Convert to JSON.
my $json = JSON->new->allow_nonref->utf8->encode($hash);
如果您确实需要
allow\u unknown
allow\u founded
提供的功能,您需要在
递归\u inplace\u stringization
中重新实现它(如果许可允许,可能通过从JSON::PP复制它),或者,您可以在调用
递归\u就地\u字符串化之前使用以下命令:

# Convert objects to strings.
$hash = JSON->new->allow_nonref->decode(
   JSON->new->allow_nonref->allow_unknown->allow_blessed->encode(
      $hash));

$\[0]=“$\[0]”
对非引用标量的值不做任何更改,这取决于引用标量是什么<代码>perl-E'sub{$\u0]。=“idesh”}->($x=3);假设$x'
@Borodin,Perl通过引用传递参数,这样就可以用字符串化替换参数。由于该值现在存储为字符串,JSON将以字符串形式输出<代码>perl-MJSON-E'$x=4;说encode_json([$x]);sub{$\[0]=“$\[0]”}->($x);说encode_json([$x]);'