2013-07-10 66 views
1

我有一個JSON對象,它有一個鍵值對,一個這樣的對的值是0E10如何強制變量在Perl中作爲字符串對待?

的問題是,此值應是一個字符串,但這個被視爲因爲信Ë的數後存在的浮子,因此它被表示0每當我打印這個值(0 * E + 10)。

有人可以幫我解決這個問題嗎?

我使用Perl來傳遞JSON並通過Javascript讀取它。 (任何語言的解決方案都可以接受

這就是我打印JSON時得到的結果。

KEY1:0E10

KEY2: 「XYZ」

你可以清楚地看到,如果該值是字符串它把在引號( 「),但0E10它沒有使用引號(」) 。

在我的情況下,問題是我正在從控制超出我的範圍的API讀取JSON。我有一個後端服務,它是用perl寫的,它傳遞API返回的JSON。所以每當我點擊一個URL時,都會調用perl編寫的後端服務。此服務從API獲取JSON並將JSON返回到正在訪問該URL的服務。

+3

你能貼這種JSON和正在如何解碼? –

+0

編輯了這個問題。 –

+0

你有'0E10'而不是''0E10'',所以它不像字符串 –

回答

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:雙引號如果你想生成key: 0E10的$值分配給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"} 
+0

但是當我給$ value賦值爲0E10時,它打印爲0. 在我的情況中,問題在於我正在從控制範圍無法控制的API讀取JSON。我有一個後端服務,它是用perl寫的,它傳遞API返回的JSON。所以每當我點擊一個URL時,都會調用perl編寫的後端服務。此服務從API獲取JSON並將JSON返回到正在訪問的URL my $ value = 0E10; my $ hr = {KEY1 =>「$ value」,KEY2 =>「XYZ」}; my $ json = encode_json $ hr; print $ json,「\ n」; #< - prints:{「KEY1」:「0」,「KEY2」:「XYZ」} –

+0

當您說'my $ value = 0E10'時,字符串信息已經丟失。你需要說'我的$值=「0E10」'。 – mob

+0

0E10在數字上下文中沒有意義,因爲這是0 * 10 ** 10 = 0 ...或許您需要的數字是1E10? –

1

(而不是key: 0一個d key: '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表示標包含存儲爲一個浮點數值。)

相關問題