如何安全地从JSON 1升级到JSON 2和utf8字符串?

Jon*_*rtz 5 perl json utf-8

我们有一个庞大的代码库,可以大量使用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以与现有代码向后兼容?

ike*_*ami 1

当模块进行类似的大幅更改时,应该使用新名称。在本例中,事实上 JSON 2.x 主要是 JSON::XS 的包装器,这一事实意味着他们所做的就是善意的。

我建议:

  1. 保留安装的 JSON 1.x。
  2. 安装 JSON::XS。
  3. 闲暇时,从 JSON 1.x 转换为 JSON::XS。
  4. 如果您愿意,现在可以安全地升级到 JSON 2.x。
    1. 安装 JSON 2.x
    2. s/JSON::XS/JSON/g