使用perl更新JSON标记格式

时间:2015-03-31 17:21:07

标签: xml json perl hash

我有一个从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&GT;标记文件需要在此处作为数组而不是普通标记。 这是愚蠢的,因为输入标记只有一个值,所以没有点作为数组,但下一步的过程是期望标记为嵌套,因此需要进行更改。

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

1 个答案:

答案 0 :(得分:1)

你无法改变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 => [ { } ] };