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

Kat*_*oak 4 perl json

为了创建一个与严格打字语言一致的API,我需要修改所有JSON以返回引用的字符串来代替整数,而不必逐个进行并修改底层数据.

这就是现在生成JSON的方式:

  my $json = JSON->new->allow_nonref->allow_unknown->allow_blessed->utf8;
  $output = $json->encode($hash);
Run Code Online (Sandbox Code Playgroud)

什么是一个很好的方式来说,"并引用该$ hash中的每个标量"?

ike*_*ami 8

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);
Run Code Online (Sandbox Code Playgroud)

如果你确实需要的功能提供allow_unknownallow_blessed,你需要重写它的内部recursive_inplace_stringification(可能是通过JSON :: PP复制它,如果许可允许),或者你可以使用之前调用如下recursive_inplace_stringification:

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

  • @Borodin,Perl通过引用传递参数,以便用其字符串化替换参数.由于该值现在存储为字符串,因此JSON将其输出为字符串.`perl -MJSON -E'$ x = 4; say encode_json([$ x]); sub {$ _ [0] ="$ _ [0]"} - >($ x); 比如encode_json([$ x]);'` (6认同)