【发布时间】:2011-10-05 00:25:58
【问题描述】:
我们拥有大量使用 JSON v1 API 的大型代码库:
use JSON;
my $json = objToJson($data);
my $data = jsonToObj($json);
我们想升级到 JSON v2,因此我们可以开始在新代码中使用它,因为我们遇到了其他依赖于 v2 API 的模块。
但是,如果我存储了一个由objToJson() 创建的 utf8 字符串,那么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];
我们有什么方法可以升级到 JSON v2,但仍然保留 v1 API 以向后兼容现有代码?
【问题讨论】:
-
JSON 不支持重载比较,那些带有
==的行并没有按照你的想法做。它只是比较两个不同引用的内存位置,这总是错误的。您需要查看数组引用的内部。此时您应该使用eq,它是字符串比较运算符。 -
哎呀,谢谢埃里克。代码已更正(问题仍然存在)。
-
我的回答有什么遗漏吗?