ref="/tag/2034/" style="color:#3D6345;font-weight:bold;">Perl解析JSON数据的实用方法
在日常工作中,处理网络接口返回的数据是常有的事。很多API都用JSON格式传输信息,比如天气查询、用户资料获取等。如果你用Perl写脚本,怎么把这一串看起来像字典的字符串变成能操作的数据?其实不难,关键在于用对模块。
Perl本身不直接支持JSON解析,但CPAN上有现成的模块——JSON。安装它很简单,大多数系统上执行这句就行:
cpan install JSON装好之后就可以在脚本里用了。假设你从某个接口拿到一段JSON字符串,内容是用户的姓名和邮箱:
my $json_text = '{"name": "张伟", "email": "zhangwei@example.com"}';接下来要把它转成Perl里的哈希引用,方便取值。代码这样写:
use JSON qw(decode_json encode_json);
my $data = decode_json($json_text);
print "姓名:$data->{name}\n";
print "邮箱:$data->{email}\n";运行后就能看到清晰的信息输出。反过来,如果你要把Perl里的数据结构发给别的服务,也可以用encode_json转回去:
my $perl_hash = {
product => '笔记本电脑',
price => 5999
};
my $json_string = encode_json($perl_hash);
print $json_string;输出结果就是标准的JSON字符串,可以直接发给HTTP请求体。
嵌套结构也能轻松应对
实际项目中,JSON往往更复杂,比如包含数组或多重嵌套。举个例子,一个订单数据可能包括多个商品:
my $order_json = '[{"id":1,"items":["鼠标","键盘"]},{"id":2,"items":["U盘"]}]';照样用decode_json处理,返回的是数组引用:
my $orders = decode_json($order_json);
for my $order (@$orders) {
print "订单号:$order->{id}\n";
for my $item (@{$order->{items}}) {
print " 商品:$item\n";
}
}循环嵌套读取,结构清楚,维护也方便。
文件读取场景示例
有时候JSON数据存在本地文件里,比如配置文件或日志。可以配合文件操作一起用:
open my $fh, '<', 'config.json' or die $!;
local $/;
my $content = <$fh>;
close $fh;
my $config = decode_json($content);
print "数据库地址:$config->{db_host}\n";只要确保文件内容是合法JSON,解析过程几乎不会出错。
遇到格式不对的JSON怎么办?建议加上eval保护:
my $data = eval { decode_json($json_text) };
if ($@) {
warn "JSON解析失败: $@\n";
} else {
# 正常处理$data
}这样脚本不会因为一条坏数据直接崩溃,适合跑定时任务时使用。