我有一个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的服务。
答案 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: 0
和key: '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
表示标量包含存储为浮点数的值。)