1

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

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

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

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

这是我打印 JSON 时得到的。

键1:0E10

KEY2:“XYZ”

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

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

4

2 回答 2

3

看到不同:

选项 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"}
于 2013-07-10T13:07:35.357 回答
1

如果要生成key: 0E10(而不是key: 0and 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表示标量包含存储为浮点数的值。)

于 2013-07-10T17:13:01.410 回答