gpt4 book ai didi

json - YAML::Tiny 不支持 JSON::XS::Boolean

转载 作者:行者123 更新时间:2023-12-04 06:08:56 24 4
gpt4 key购买 nike

当读取一些JSON数据结构,然后尝试Dump他们使用 YAML::Tiny ,我有时会收到错误

YAML::Tiny does not support JSON::XS::Boolean

我明白为什么会这样(特别是 YAML::Tiny 不支持 bool 值, JSON 热衷于与其他标量清楚地区别开来),但是有没有快速的方法来改变这些 JSON::XS::Boolean对象变成普通 0的和 1只是为了快速转储到屏幕吗?

最佳答案

YAML::Tiny不支持对象。不幸的是,它甚至没有将所有对象字符串化的选项,这将处理 JSON::XS::Boolean .

不过,您可以使用递归函数轻松地做到这一点:

use strict;
use warnings;
use 5.010; # for say

use JSON::XS qw(decode_json);
use Scalar::Util qw(blessed reftype);
use YAML::Tiny qw(Dump);

my $hash = decode_json('{ "foo": { "bar": true }, "baz": false }');

# Stringify all objects in $hash:
sub stringify_objects {
for my $val (@_) {
next unless my $ref = reftype $val;
if (blessed $val) { $val = "$val" }
elsif ($ref eq 'ARRAY') { stringify_objects(@$val) }
elsif ($ref eq 'HASH') { stringify_objects(values %$val) }
}
}

stringify_objects($hash);

say Dump $hash;

此函数不会处理标量引用,因为 JSON 不会生成它们。它也不检查对象是否确实具有重载的字符串化。

Data::Rmap对此效果不佳,因为它只会访问特定对象一次,无论它出现多少次。自 JSON::XS::Boolean对象是单例,这意味着它只会找到第一个 true和第一个 false .可以解决这个问题,但需要深入研究源代码以确定如何在其 seen 中生成 key 。哈希:
use Data::Rmap qw(rmap_ref);
use Scalar::Util qw(blessed refaddr);

# Stringify all objects in $hash:
rmap_ref { if (blessed $_) { delete $_[0]->seen->{refaddr $_};
$_ = "$_" } } $hash;

我觉得递归函数更清晰,不易受 Data::Rmap变化的影响.

关于json - YAML::Tiny 不支持 JSON::XS::Boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com