在 perl 中使用更新 JSON 标签格式

Updating JSON tags format using in perl

我有一个从 XML 文件生成 JSON 的 perl 代码。一切正常,我正在正确完成转换。

因此,当前代码一般从 XML 生成 JSON,即 JSON 的所有标签及其结构与 XML 文件中的相同。

但我希望 JSON 标签始终具有某种特定格式,而不管输入 xml.

例如,这里是 perl 代码的代码片段,输入 XML,一般生成 JSON,预期 JSON。

XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Person SchemaVersion="1.0.8">
    <personalData>
        <workList>
            <file>
                 "fileName": "/usr/temp/RPM_020515_.tar.gz",
            </file>
        </workList>
    </personalData>
</Person>

Perl 代码:

 #!/usr/bin/perl
 use strict;
 use warnings FATAL => qw( all );
 use Data::Dumper;

 use JSON;

    # Create the object of XML Simple
    my $xmlSimple = new XML::Simple(KeepRoot   => 1);

    # Load the xml file in object
    my $dataXML = eval { $xmlSimple->XMLin(Input_XML_File_Path)};

    # use encode json function to convert xml object in json.
    my $jsonString = encode_json($dataXML);

    print $jsonString;

当前输出JSON:

{
    "Person":{

       "personalData": {
          "workList": {
             "file":{
                "fileName": "/usr/temp/ABC.txt"
               }
           },
       }
    }
 } 

要生成的新输出:

{
    "Person":{

       "personalData": {
          "workList": {
             "file":[
                 { "fileName": "/usr/temp/ABC.txt" }
              ]
           },
         "eventList": {
            "event": [
                 {}
             ]
          }
        }
      }   
    }

当前生成的 JSON 输出与需要生成的输出之间的差异:

1> 这里要追求标签文件是一个数组,而不是普通的标签。 这是愚蠢的,因为输入标签只有一个值,所以没有点作为数组,但下一步过程期望标签嵌套,因此需要进行更改。

    "file":[
        { "fileName": "/usr/temp/ABC.txt" }
      ]

代替以下内容:

    "file":{
        "fileName": "/usr/temp/ABC.txt"
      }

2> 输入 xml 文件中不存在标记事件列表,因此需要进行硬编码,以便输出 JSON 始终包含该标记。 (流程的下一步需要那个)。

如有任何问题,请告诉我。

注意:我可以将新标签添加到 JSON 但不是我想要的方式。

 my $tempHash = decode_json($jsonString );
 # adding the new key-value pair into the hash map
 $tempHash->{'Person'}->{'PersonalData'}->{'workList'}->{$key} = $val;
 # encoding the hash map back into JSON
 my $jsonWithKey =  encode_json($tempHash);

你无法改变JSON;您可以更改将使用 JSON 编码的数据结构。由于这是一个 Perl 问题,我将使用 Perl 语法来描述这些结构而不是 JSON。这应该使您的问题的解决方案变得显而易见。

  1. 你问怎么改

    { fileName => "/usr/temp/ABC.txt" }
    

    [ { fileName => "/usr/temp/ABC.txt" } ]
    

    简直了

    $var = [ $var ];
    

    在上下文中,那是

    $data->{Person}{personalData}{workList}{file} =
       [ $data->{Person}{personalData}{workList}{file} ];
    
  2. 你问的是怎么改

    { }
    

    { eventList => { event => [ { } ] } }
    

    向引用的散列添加一个元素很简单

    $hash_ref->{$key} = $value;
    

    在上下文中,那是

    $data->{Person}{eventList} = { event => [ { } ] };