【问题标题】:How to access JSON data from perl?如何从 perl 访问 JSON 数据?
【发布时间】:2014-08-25 05:26:18
【问题描述】:

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

但这只是拆分标题的值并返回。

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

【问题讨论】:

  • JSON::Parse 是不可能的吗?
  • 我不认为这是问题所在,但为了让您知道,您发布的 JSON 无效。
  • jq 是一个漂亮的命令行过滤器,用于 sed/awk 排序的 json。 stedolan.github.io/jq
  • 我编辑了帖子以使 JSON “有效”。我使用在线服务和jqjson_verify 来检查工作。我的想法是像这样的基本问题可能有助于回答(甚至重复),但它需要适当的数据才能有用。如果它是另一个 SO 帖子 (e.g. see this one on JSON and perl) 的副本,我不会感到惊讶。但我认为没关系:-)

标签: json perl data-structures


【解决方案1】:

我建议使用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 文章中找到更多详细信息。

【讨论】:

    【解决方案2】:

    是的,您可以使用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 哈希的机制。该文档有很多有用的示例。

    【讨论】:

      【解决方案3】:

      命令行上的Perl:

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

      输出(相关部分):

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

      【讨论】:

      • 啊,好的。更新了在命令行上使用 Perl 执行的响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2019-01-16
      相关资源
      最近更新 更多