我有一个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数据元素吗?
答案 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模块。当然,它可以通过cpan
,cpanm
或您系统的打包系统进行安装。将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
哈希的一些机制。该文档有很多有用的例子。