【问题标题】:Pass data from JSON to variable for comparison将数据从 JSON 传递到变量以进行比较
【发布时间】:2017-10-13 14:08:51
【问题描述】:

我有一个使用 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 中的一些名称包含诸如 \u2122 的 (TradeMark) 之类的字符(有些情况是其他字符),所以我无法与另一个名称进行比较已经具有正确名称的变量

nome1™

如果我只能保存已经“转换”的 JSON,那么剩下的字符会帮助我。

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

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

【问题讨论】:

  • 您的小sn-ps 代码根本无法说明您在做什么。例如,$nome1json 是什么?请添加minimal reproducible example,以便我们更好地帮助您找到问题的解决方案。
  • 基本上在请求 API 之后,我想将内容保存在一个已经将所有 \u2122 转换为各自字符的变量中(这是我不知道如何在 Perl 中执行的部分)然后使用另一个变量来比较它们的名称是否等于显示价格。如果我的问题含糊不清,我很抱歉。
  • 您目前如何将 JSON 数据转换为您转储的 Perl 数据结构?为什么 消失了?

标签: json perl


【解决方案1】:

如果我理解正确,您需要将收到的 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 将返回一个转换后的值的引用。在这种情况下,哈希参考。从那里你可以进入 JSON。

如果您知道 $name 将在 JSON 中,您可以省略 defined 部分。否则,defined 子句将告诉您哈希值是否存在。你知道的,你可以用它做点什么。如果哈希值是一个没有特殊字符的单词,您可以使用$var1->{response}->{prices}->{$name},但使用$var1->{'response'}->{'prices'}->{$name} 总是更安全。 Perl 处理哈希引用有点难看...

顺便说一句,在JSON::XS 中,您还可以找到encode_json 函数来做相反的事情,并且也是一个面向对象的接口。

【讨论】:

  • 认为最后一个$name 应该是$match
  • 是的,我的错。固定的。谢谢。
  • @JavierElices 这工作得很好,但是我需要比较的变量的数据是在一个用 UTF-8 编码的 txt 中,txt 中的数据已经有字符(★,™)一些名字只是没有字符的纯文本,所以你传递的代码只能在它们只是纯文本时同化名称,有什么提示吗?
  • 转换后的文本将采用 UTF8 格式。如果您的数据也是 UTF8 格式(Unicode 的一个子集),那么 Perl 处理或比较应该没有问题。你确定你的数据是 UTF8 的吗?如果将它们打印到同一个终端,它们看起来是否相似?
  • 这个txt中的数据是在另一个API中获取的,在这个API中我需要比较的名字已经用符号“转换”了,即变量my $name = "名称1™";它实际上来自作为数组的 txt,但在这个其他 API 中,名称已经列出如下:“name”:“nome1 ™”,而不是“name”:“name \ u2122”,因为它在 API 的情况下您发送给我的代码,然后当您的代码尝试比较 API 数据时(if (defined $ var1 -> {'response'} -> {'prices'} -> {$ name}) {)它们不匹配。如果是这样,我该如何编辑我的帖子以更好地解释它?感谢您的帮助。
猜你喜欢
  • 2023-03-22
  • 2012-11-09
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多