将数据从JSON传递到变量以进行比较

时间:2017-10-13 14:08:52

标签: json perl

我有一个使用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进行比较,如果对另一个变量为真,则会preco2preco3打印所有内容

我遇到的最大问题是,JSON中的某些名称包含像({TradeMark)这样的字符\u2122(有些情况下是其他字符),所以我无法与名称进行比较另一个已经具有正确名称的变量

nome1™

如果我只能保存已经“转换”的JSON,那么角色会帮助我完成其余的工作。

基本上在执行API请求后,我想将内容保存在已经将所有\u2122转换为各自字符的变量中(这是我不知道如何在Perl中执行的部分)然后使用另一个变量来比较它们的名称等于显示价格

感谢您的帮助和任何问题,请告诉我,我尝试以另一种方式再次解释。

1 个答案:

答案 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函数,也可以找到面向对象的接口。