我在Perl正则表达式中需要一些帮助。 我有这个字符串:
{
"ITEM":[
{
"-itemID": "1000000" ,
"-itemName": "DisneyJuniorLA" ,
"-thumbUrl": "" ,
"-packageID": "1" ,
"-itemPrice": "0" ,
"-isLock": "true"
},
{
"-itemID": "1000001" ,
"-itemName": "31 minutos" ,
"-thumbUrl": "" ,
"-packageID": "1" ,
"-itemPrice": "0" ,
"-isLock": "true"
},
{
"-itemID": "1000002" ,
"-itemName": "Plaza Sésamo" ,
"-thumbUrl": "" ,
"-packageID": "1" ,
"-itemPrice": "0" ,
"-isLock": "true"
},
]
}
字符串位于变量中:$jsonString
我有另一个变量:$itemName
我想只保留$jsonString
itemName之上的itemId值(其中itemName等于$itemName
)
我真的很感谢你的帮助。我在正则表达式中非常业余。
谢谢!
答案 0 :(得分:1)
不要使用正则表达式来解析JSON。使用JSON。
基本上:
use strict;
use warnings;
use Data::Dumper;
use JSON;
my $json_string;
{
open( my $json_in, "<", 'test.json' );
local $/;
$json_string = <$json_in>;
}
my $json = decode_json ( $json_string );
print Dumper \$json;
foreach my $item ( @{ $json -> {'ITEM'} } ) {
print $item -> {'-itemID'},"\n";
print $item -> {'-itemName'},"\n";
}
但你必须先修好你的json。 (有一个尾随的逗号不应该存在。)
JSON是一种已定义的数据传输结构。虽然你可以技术上将其视为“纯文本”并从文本中提取内容,但这绝对是错误的做事方式。
它可能会在很长一段时间内正常工作,但如果您的源程序稍微改变 - 并且更改其输出,同时仍然坚持JSON标准 - 您的代码将意外中断,您可能没有意识到。这可能会导致破坏的多米诺骨牌效应,使整个系统或网站崩溃和烧毁。更糟糕的是 - 此崩溃和刻录的源将被隐藏在一些多年未触及的脚本中,因此很难修复。
这是我作为专业系统管理员的烦恼之一。请不要去那里。
答案 1 :(得分:1)
尽管您的JSON字符串格式错误(在数组中的最后一个元素之后还有一个额外的逗号,应该由生成“JSON”的人修复),尝试使用regexp来处理这个只是意味着您现在有两个问题而不是一个。
更具体地说,JSON中的对象是明确的无序组键/值对。完全可能的是,改变JSON的任何内容都可以被重写,使得JSON在语义上相同但序列化不同,使任何依赖于当前结构脆弱和错误的东西容易发生
相反,使用适当的JSON解码器,然后直接遍历生成的对象层次结构以找到所需的元素:
use JSON;
use utf8;
# decode the JSON
my $obj = decode_json($jsonString);
# get the ITEM array
my $itemRef = $obj->{ITEM};
# find all elements matching the item name
my @match = grep { $_->{'-itemName'} eq $itemName } @{$itemRef};
# extract the item ID
if (@match) {
my $itemID = $match[0]->{'-itemID'};
print $itemID;
}