如何从perl访问JSON数据?

时间:2014-07-03 23:31:22

标签: json perl data-structures

我有一个JSON文件,如下所示。

{
    "card":{
      "cardName":"10AN10G",
      "portSignalRates":[
         "10AN10G-1-OTU2",
         "10AN10G-1-OTU2E",
         "10AN10G-1-TENGIGE",
         "10AN10G-1-STM64"
      ],
      "listOfPort":{
         "10AN10G-1-OTU2":{
            "portAid":"10AN10G-1-OTU2",
            "signalType":"OTU2",
            "tabNames":[
               "PortDetails"
            ],
            "requestType":{
               "PortDetails":"PTP"
            },
            "paramDetailsMap":{
               "PortDetails":[
                  {
                     "type":"dijit.form.TextBox",
                     "name":"signalType",
                     "title":"Signal Rate",
                     "id":"",
                     "options":[

                     ],
                     "label":"",
                     "value":"OTU2",
                     "checked":"",
                     "enabled":"false",
                     "selected":""
                  },
                  {
                     "type":"dijit.form.TextBox",
                     "name":"userLabel",
                     "title":"Description",
                     "id":"",
                     "options":[

                     ],
                     "label":"",
                     "value":"",
                     "checked":"",
                     "enabled":"true",
                     "selected":""
                  },
                  {
                     "type":"dijit.form.Select",
                     "name":"Frequency",
                     "title":"Transmit Frequency"
                  }
               ]
            }
         }
      }
   }
}

我要求输出为:

signalType:"Signal Rate",
userLabel:"Description",
Frequency:"Transmit Frequency",.. ,.....

我尝试过:

grep -oP '(?<=\"title\":\")[^"]*' file > outfile 

但这只是将title的值拆分并返回。

我可以使用perl访问我想要的JSON数据元素吗?

3 个答案:

答案 0 :(得分:2)

我建议使用decode_json而不是正则表达式。首先,从CPAN安装JSON模块:

sudo perl -MCPAN -e 'install JSON'

或者你可以在Ubuntu上使用apt-get

sudo apt-get install libjson-pp-perl

安装完成后,您可以使用以下代码:

my $json = '{... your json string ...}';
my $decoded = decode_json($json);

$decoded->{'card'}{'listOfPort'}{'10AN10G-1-OTU2'}{'signalType'}

您可以在this文章中找到更多详细信息。

答案 1 :(得分:0)

命令行上的Perl:

perl -pe 's/"name":"([^"]+)","title":/"$1":/g' file > outfile

输出(相关部分):

{"card": ... "signalType":"Signal Rate", ... "userLabel":"Description", ... "Frequency":"Transmit Frequency" ... }

答案 2 :(得分:0)

是的,您可以使用JSON perl模块。当然,它可以通过cpancpanm或您系统的打包系统进行安装。将JSON解析为哈希,然后以Perl的正常方式使用它。这是一个简单的例子:

use JSON;
use IO::All;
use strict;
use warnings;

my $data < io '/tmp/data.json';
my $j = decode_json($data);

use DDP; # for quick debug printing

p $j->{card}{listOfPort}{"10AN10G-1-OTU2"}{paramDetailsMap}{PortDetails}[0]{title}
"Signal Rate"

您可能希望使用一些深度潜水技术来更轻松地/编程地获取内部值(请查看Data::Diver模块) - 我的示例仅表示它是可行的使用优秀的JSON模块将JSON映射到perl哈希的一些机制。该文档有很多有用的例子。