Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将JSON中的标记名转换为CamelCase符号_Xml_Json_Perl - Fatal编程技术网

Xml 将JSON中的标记名转换为CamelCase符号

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":

我的JSON如下所示:

{
    "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} );