2012-11-27 47 views
13

顯然,無窮大和NaN不是JSON規範的一部分,所以這個PHP代碼:PHP:如何將無限或NaN編號編碼爲JSON?

$numbers = array(); 
$numbers ['positive_infinity'] = +INF; 
$numbers ['negative_infinity'] = -INF; 
$numbers ['not_a_number'] = NAN; 
$array_print = print_r ($numbers, true); 
$array_json = json_encode ($numbers); 
echo "\nprint_r(): $array_print"; 
echo "\njson_encode(): $array_json"; 

產生以下:

PHP Warning: json_encode(): double INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8 
PHP Warning: json_encode(): double -INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8 
PHP Warning: json_encode(): double NAN does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8 

print_r(): Array 
(
    [positive_infinity] => INF 
    [negative_infinity] => -INF 
    [not_a_number] => NAN 
) 

json_encode(): {"positive_infinity":0,"negative_infinity":0,"not_a_number":0} 

有沒有辦法正確編碼,這些數字沒有寫我自己json_encode()功能?也許有一些解決方法?

回答

7

根據JSON規範,不存在無窮大或NaN值:http://json.org/

解決方法:

  1. 拒絕使用JSON(純JSON),並寫自己的json_encode函數,該函數將處理INF/NAN(分別轉換爲「Infinity」和「NaN」),並確保在客戶端使用類似result = eval('(' + json + ')');的東西解析JSON。

  2. 將您的IFN/NAN值轉換爲字符串值('Infinity'和'NaN'),並且當您要使用JavaScript中的這些值操作時,請使用以下構造:var number1 = (+numbers.positive_infinity);。這會將字符串值'Infinity'轉換爲數字Infinity表示。

9

你是對有關JSON spec:不能被表示爲數字序列(如無限與NaN)是不允許

數值。

該解決方案還必須來自規範,因爲定製的「JSON」編碼器將不會反正產生有效的JSON(你會寫一個自定義的解碼器爲好,然後你和你的數據的消費者會被迫使用,直到時間結束)。

這裏什麼規範允許值:

甲JSON值必須是一個對象,數組編號,或串,或以下三個字面名稱之一:

false null true 

因此,任何涉及合法JSON而不是自定義類JSON協議的解決方法都會涉及使用其他數字而不是數字。

一個合理的選擇是對這些邊緣情況使用字符串"Infinity""NaN"

+1

+1引用規範和提及文字。然而接受另一個答案,因爲它建議了將它們轉換回數字的方式。 – Septagram

10

這在我看來是JSON的一大缺點。不同的JSON編碼器處理這個不同,簡要概述可以在這裏找到:http://lavag.org/topic/16217-cr-json-labview/?p=99058

一個解決方案是編碼+ INF爲+ 1e9999爲自然會溢出到大多數解碼器+ INF,並用相同的-INF -1e9999 。 NaN更難。

0

作爲更新這個問題對於PHP> = 5.5.0的新版本的讀者,獲得由json_encodeINFNAN值編碼爲0,而不是json_encode未能輸出可言,添加JSON_PARTIAL_OUTPUT_ON_ERROR選項。

作爲示例:json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);