转换JSON中的标记名称以遵循CamelCase表示法

时间:2015-03-24 14:39:52

标签: xml json perl

我正在使用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}全部转换为小写。

1 个答案:

答案 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} );