Xml 将JSON中的标记名转换为CamelCase符号
我的JSON如下所示:Xml 将JSON中的标记名转换为CamelCase符号,xml,json,perl,Xml,Json,Perl,我的JSON如下所示: { "Person": { "IDCountry": "0", "Home": { "ID": "ABC-XYZ", "Laptop": { "FileName": "/usr/temp/RPM_020515_.tar.gz", "Key": "123456789" }, "Location":
{
"Person": {
"IDCountry": "0",
"Home": {
"ID": "ABC-XYZ",
"Laptop": {
"FileName": "/usr/temp/RPM_020515_.tar.gz",
"Key": "123456789"
},
"Location": {
"Number": "62",
"MaxSize": "0"
},
}
}
}
此JSON是使用以下代码从perl中的XML文件中的某个单独方法生成的:
#!/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表示case
{
"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,膝上型电脑,Key,Location,Number}全部转换成小写
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;
与
您能解释一下这段代码的作用吗?代码中的一些注释应该会有帮助。@user1188611大声读出来。这段代码不需要任何注释。是的,很抱歉,这是显而易见的代码,我的注释是指如何将它集成到我的用例中。我是编码专业的大二学生(没有太多的编码背景),所以问这个问题,让我试着整合一下。感谢您将
lc
更改为lcfirst
。修复了我答案中的一个错误。
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} );