【问题标题】:How to force a variable to be treated as a String in perl?如何强制将变量视为 perl 中的字符串?
【发布时间】:2013-07-10 12:38:14
【问题描述】:

我有一个 JSON 对象,它有一个键值对,其中一对的值为 0E10

问题是这个值应该是一个字符串,但由于在数字后存在字母 E,它被视为浮点数,因此每当我打印这个值时它都显示 0 ( 0*e+10)。

有人可以帮我解决这个问题吗?

我正在使用 perl 传递 JSON 并通过 Javascript 读取它。 (任何语言的解决方案都可以接受

这是我打印 JSON 时得到的。

KEY1 : 0E10

KEY2:“XYZ”

您可以清楚地看到,如果值是字符串,它会放在引号 (") 下,但对于 0E10,它没有使用引号 (")。

我的问题是我正在从一个我无法控制的 API 读取 JSON。我有一个用 perl 编写的后端服务,它传递 API 返回的 JSON。因此,每当我点击一个 URL 时,就会调用用 perl 编写的后端服务。此服务从 API 获取 JSON 并将 JSON 返回到访问 URL 的服务。

【问题讨论】:

  • 你能粘贴这样的json吗?如何解码?
  • 你有0E10而不是"0E10",所以它不像字符串
  • 您需要向人们展示您是如何创建 JSON 的。同时,perldocperlnumber 中的讨论可能会有所帮助。
  • JSON 会自动将字符串放入引号中,但在这种情况下它没有这样做,因为它会将其视为浮点数。
  • 你是说外国 API 对待 key: 0E10key: 0 的方式不同,你想要前者吗?

标签: json string perl exponent


【解决方案1】:

看看区别:

选项 A

use strict;
use warnings;
use JSON;

my $value = 12345;
my $hr = { KEY1=> $value, KEY2=> "XYZ" };
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: {"KEY2":"XYZ","KEY1":12345}

选项 B:双引号将 $value 赋值给 KEY1

use strict;
use warnings;
use JSON;

my $value = 12345;
my $hr = { KEY1=> "$value", KEY2=> "XYZ" };
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: {"KEY2":"XYZ","KEY1":"12345"}

【讨论】:

  • 但是当我将 $value 设为 0E10 时,它会打印为 0。在我的情况下,问题是我正在从我无法控制的 API 读取 JSON。我有一个用 perl 编写的后端服务,它传递 API 返回的 JSON。因此,每当我点击一个 URL 时,就会调用用 perl 编写的后端服务。该服务从 API 获取 JSON 并将 JSON 返回到访问 URL my $value = 0E10; 的服务。我的 $hr = { KEY1=> "$value", KEY2=> "XYZ" };我的 $json = encode_json $hr;打印 $json, "\n"; #
  • 当你说my $value = 0E10时,字符串信息已经丢失。你需要说my $value = "0E10"
  • 0E10 在数字上下文中没有意义,因为这是 0*10**10 = 0...也许您需要的数字是 1E10 ¿?
【解决方案2】:

如果您想生成key: 0E10(而不是key: 0key: '0E10'),那么您必须生成自己的JSON。 Perl 无法以不同于0E9 的方式存储0E10。 (JavaScript、Java、C、C++ 等也不行)

如果您愿意接受任何指数,您可能仍需要生成自己的 JSON。 Perl 没有类型系统,JSON 编码器倾向于对整数使用整数表示法(在数学意义上)。

我专门测试了 JSON::XS 和 JSON::PP 将使用 0 作为内部存储为浮点数的零。

$ perl -MJSON::XS -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x8002b7d8) at 0x800720f0
  REFCNT = 1
  FLAGS = (NOK,pNOK)
  IV = 1
  NV = 0
  PV = 0
[0]

$ perl -MJSON::PP -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x801602b0) at 0x8008e520
  REFCNT = 1
  FLAGS = (NOK,pNOK)
  IV = 1
  NV = 0
  PV = 0
[0]

NOK 表示标量包含存储为浮点数的值。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2013-05-27
    相关资源
    最近更新 更多