我有一个使用GET在API中创建的请求
LWP::UserAgent
,
数据以JSON形式返回,最多包含两个结果,如下所示:
{
"status":1,
"time":1507891855,
"response":{
"prices":{
"nome1\u2122":{
"preco1":1111,
"preco2":1585,
"preco3":1099
},
"nome2":{
"preco1":519,
"preco2":731,
"preco3":491
}
}
}
}
转储:
$VAR1 = {
'status' => 1,
'time' => 1507891855,
'response' => {
'prices' => {
'nome1' => {
'preco1' => 1111,
'preco3' => 1099,
'preco2' => 1585
},
'nome2' => {
'preco3' => 491,
'preco1' => 519,
'preco2' => 731
}
}
}
};
我想做的是:
获取此数据并将其保存在变量中,以便使用if
与已存储名称的另一个变量进行比较。比较将与name1
/ name2
进行比较,如果对另一个变量为真,则会preco2
和preco3
打印所有内容
我遇到的最大问题是,JSON中的某些名称包含像({TradeMark)这样的字符\u2122
(有些情况下是其他字符),所以我无法与名称进行比较另一个已经具有正确名称的变量
nome1™
如果我只能保存已经“转换”的JSON,那么角色会帮助我完成其余的工作。
基本上在执行API请求后,我想将内容保存在已经将所有\u2122
转换为各自字符的变量中(这是我不知道如何在Perl中执行的部分)然后使用另一个变量来比较它们的名称等于显示价格
感谢您的帮助和任何问题,请告诉我,我尝试以另一种方式再次解释。
答案 0 :(得分:0)
如果我理解正确,您需要将以UTF8格式收到的JSON提供给您可以处理的内部变量。为此,您可以使用JSON::XS:
use utf8;
use JSON::XS;
my $name = "nome1™";
my $var1 = decode_json $utf8_encoded_json_text;
# Compare with name in $name
if( defined $var1->{'response'}->{'prices'}->{$name} ) {
# Do something with the name that matches
my $match = $var1->{'response'}->{'prices'}->{$name};
print $match->{'preco1'}, "\n";
}
通过在脚本开头指定use utf8;
,确保告诉Perl解释器您的源是UTF8。然后确保使用支持该格式的编辑器编辑脚本。
函数decode_json
将返回ref到转换后的值。在这种情况下,哈希引用。从那里开始学习JSON。
如果您知道$name
将出现在JSON中,则可以省略defined
部分。否则,defined
子句将告诉您哈希值是否存在。你知道的,你可以用它做点什么。如果哈希值是一个没有特殊字符的单词,您可以使用$var1->{response}->{prices}->{$name}
,但使用$var1->{'response'}->{'prices'}->{$name}
总是更安全。 Perl处理哈希引用有点难看......
顺便说一句,在JSON::XS
中,您还会找到相反的encode_json
函数,也可以找到面向对象的接口。