【问题标题】:converting the tag names in JSON to follow CamelCase notation将 JSON 中的标签名称转换为遵循 CamelCase 表示法
【发布时间】:2015-05-27 22:21:40
【问题描述】:

我有一个如下的 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 的情况。

 {
    "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 } 全部转换为小写。

【问题讨论】:

    标签: xml json perl


    【解决方案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} );
    

    【讨论】:

    • 你能解释一下这段代码在做什么吗,代码中的几个 cmets 应该会有帮助。
    • @user1188611 大声读出来。此代码不需要任何 cmets。
    • 是的,很抱歉,这是明显的代码,通过评论我的意思是说我如何将它集成到我的用例中。我是编码的大二学生(没有太多编码背景)所以问这个,让我尝试整合它。谢谢
    • lc 更改为lcfirst
    • 修复了我的回答中的一个错误。
    猜你喜欢
    • 2021-01-09
    • 2011-01-23
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2023-03-20
    • 2016-05-16
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多