我正在使用JSON,如下所示:
{
"Person": {
"IDCountry": "0",
"Home": {
"ID": "ABC-XYZ",
"Laptop": {
"FileName": "/usr/temp/RPM_020515_.tar.gz",
"Key": "123456789"
},
"Location": {
"Number": "62",
"MaxSize": "0"
},
}
}
}
使用以下代码从perl中的XML文件中使用某个单独的方法生成此JSON:
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
use XML::Simple;
use XML::LibXML;
# Create the object of XML Simple
my $xmlSimple = new XML::Simple(KeepRoot => 1);
# Load the xml file in object
my $dataXML = eval { $xmlSimple->XMLin($xmlFileName)};
# use encode json function to convert xml object in json.
my $jsonString = eval { encode_json($dataXML) };
print $jsonString;
这里的一切都运转良好。但我想将输出JSON标记名称全部小写。那就是我想要这样的输出。
{
"person": {
"idCountry": "0",
"home": {
"id": "ABC-XYZ",
"laptop": {
"fileName": "/usr/temp/RPM_020515_.tar.gz",
"key": "123456789"
},
"location": {
"number": "62",
"maxSize": "0"
},
}
}
}
我当前的输出JSON标记与生成它的xml文件中的元素名称相同。
如何在我当前的perl脚本中进行更改,以使json中的标记全部跟随驼峰大小写。
感谢。
JSON用于我们想要处理特定元素获得小写且特定元素获得驼峰的情况。
{
"person": {
"idcountry": "0",
"home": {
"id": "ABC-XYZ",
"laptop": {
"fileName": "/usr/temp/RPM_020515_.tar.gz",
"key": "123456789"
},
"location": {
"number": "62",
"maxSize": "0"
},
}
}
}
如果你看到maxSize和fileName遵循camelCase约定,但所有其他标签都是小写的。
那是我们有两个清单:
{FileName,MaxSize}这些在转换后转换为 {Person,IDCountry,Home,ID,Laptop,Key,Location,Number}全部转换为小写。
答案 0 :(得分:1)
use List::Util 1.29 qw( pairmap );
my %override = map { fc($_) => $_ } qw( maxSize fileName );
sub fix {
my ($arg) = @_;
defined($arg)
or return;
my $reftype = ref($arg)
or return;
if ($reftype eq 'ARRAY') {
fix($_) for @$arg;
}
elsif ($reftype eq 'HASH') {
%$arg = pairmap { $override{fc($a)} // lc($a), $b } %$arg;
fix($_) for values(%$arg);
}
}
my $data = { Person => { ... } };
fix($data);
为了向后兼容,您可以替换
use List::Util 1.29 qw( pairmap );
my %override = map { fc($_) => $_ } qw( maxSize fileName );
%$arg = pairmap { $override{fc($a)} // lc($a), $b } %$arg;
与
my %override = map { lc($_) => $_ } qw( maxSize fileName );
my @old_keys = keys(%$arg);
my @new_keys = map { $override{lc($_)} || lc($_) } @old_keys;
@$arg{@new_keys} = delete( @$arg{@old_keys} );