perl可以使用JSON模块很方便的处理json的序列化和反序列化。先来一段简单的例子:
#! /usr/bin/perl
use v5.14;
use JSON;
use IO::File;my $info = {id => 1024,desc => 'hello world',arry => [1, 2, 3, 4, 5],obj => {char => [ 'A', 'B', 'C' ]}
};say to_json($info, { pretty => 1 });
脚本执行后的输出结果:
to_json 就是序列化,把hash对象序列化为json字符串,如果有需要,可以直接把这个字符串写入文件。函数调用中有一个 pretty => 1 的使用,默认不传入这个参数或者 pretty => 0, 结果如下:
{"arry":[1,2,3,4,5],"desc":"hello world","id":1024,"obj":{"char":["A","B","C"]}}
json中如果要使用 true、false、null这些特殊值,可以如下使用,在之前的那个脚本中我们继续添加举例:
#! /usr/bin/perl
use v5.14;
use JSON;
use IO::File;my $info = {id => 1024,desc => 'hello world',arry => [1, 2, 3, 4, 5],obj => {char => [ 'A', 'B', 'C' ]},other_1 => {test_true => \1,test_false => \0,test_null => undef},other_2 => {test_true => JSON::true,test_false => JSON::false,test_null => JSON::null}
};say to_json($info, { pretty => 1 });
输出结果如下:
{"other_2" : {"test_true" : true,"test_null" : null,"test_false" : false},"obj" : {"char" : ["A","B","C"]},"arry" : [1,2,3,4,5],"id" : 1024,"other_1" : {"test_false" : false,"test_null" : null,"test_true" : true},"desc" : "hello world"
}
在脚本中可以清楚的看到两种表示方法:
了解了JSON模块的序列化,下面来看反序列化的处理,为了说明简洁,这里直接把上面脚本的输出结果加在脚本中,使用perl的DATA句柄读取数据,脚本如下:
#! /usr/bin/perl
use v5.14;
use JSON;
use IO::File;# 读取json字符串数据
my $json_str = join('', <DATA>);
# 反序列化操作
my $json = from_json($json_str);say $json->{desc};
say '-' x 60;say $json->{other_1}{test_true};
say $json->{other_1}{test_false};
unless (defined $json->{other_1}{test_null}) {say '---------null';
}
say '-' x 60;
say for @{ $json->{arry} };__DATA__
{"id" : 1024,"desc" : "hello world","other_1" : {"test_null" : null,"test_false" : false,"test_true" : true},"obj" : {"char" : ["A","B","C"]},"other_2" : {"test_false" : false,"test_null" : null,"test_true" : true},"arry" : [1,2,3,4,5]
}
脚本读取json字符串数据后使用from_json反序列化得到一个hash引用,然后打印出部分字段的值,结果如下:
hello world
------------------------------------------------------------
1
0
---------null
------------------------------------------------------------
1
2
3
4
5
可以看到,输出值是正确的。其中true输出的是1,false输出的是0。