如何强制变量在perl中被视为String?

时间:2013-07-10 12:38:14

标签: json string perl exponent

我有一个JSON对象,它有一个键值对,一个这样的对的值是 0E10

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

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

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

这是我打印JSON时得到的结果。

KEY1:0E10

KEY2:“XYZ”

你可以清楚地看到,如果值是字符串,它会置于引号(“)之下但是对于0E10,它不使用引号(”)。

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

2 个答案:

答案 0 :(得分:2)

看到区别:

选项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 :双重引用分配给KEY1的$ value

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"}

答案 1 :(得分:1)

如果您想生成key: 0E10(而不是key: 0key: '0E10'),那么您必须生成自己的JSON。 Perl无法以0E10的方式存储0E9。 (既不是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表示标量包含存储为浮点数的值。)