我们有一个庞大的代码库,可以大量使用JSON v1 API:
use JSON;
my $json = objToJson($data);
my $data = jsonToObj($json);
Run Code Online (Sandbox Code Playgroud)
我们想升级到JSON v2,因此我们可以在新代码中开始使用它,因为我们遇到了依赖于v2 API的其他模块.
但是,如果我已经存储了由其创建的utf8字符串objToJson(),则JSON :: XS将不会再以相同的方式对其进行解码(这是JSON v2在幕后使用的).
use JSON;
use JSON::XS;
use warnings;
use strict;
my $data = ["\x{263a}b"];
my $encoded = JSON::objToJson($data);
print "different!\n"
unless JSON::jsonToObj($encoded)->[0] eq JSON::XS::decode_json($encoded)->[0];
print "different!\n"
unless JSON::jsonToObj($encoded)->[0] eq JSON::XS->new->decode($encoded)->[0];
Run Code Online (Sandbox Code Playgroud)
我们有什么方法可以升级到JSON v2,但仍然保留v1 API以与现有代码向后兼容?
当模块进行类似的大幅更改时,应该使用新名称。在本例中,事实上 JSON 2.x 主要是 JSON::XS 的包装器,这一事实意味着他们所做的就是善意的。
我建议: