加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:19:21 所属栏目:大数据 来源:网络整理
导读:为了创建一个与严格打字语言一致的API,我需要修改所有 JSON以返回引用的字符串来代替整数,而不必逐个进行并修改底层数据. 这就是现在生成JSON的方式: my $json = JSON-new-allow_nonref-allow_unknown-allow_blessed-utf8; $output = $json-encode($hash);
为了创建一个与严格打字语言一致的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 $reftypen");
   }
}

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

# Convert to JSON.
my $json = JSON->new->allow_nonref->utf8->encode($hash);

如果您确实需要allow_unknown和allow_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));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读