2012-11-27 10 views
13

जाहिर है, अनंत और NaN JSON विनिर्देशन के एक हिस्से नहीं हैं, इसलिए इस PHP कोड:PHP: जेएसओएन को अनंत या NaN संख्या कैसे एन्कोड करें?

$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 संभाल लेंगे बारे में/एनएएन (क्रमशः "इन्फिनिटी" और "नाएन" में परिवर्तित), और सुनिश्चित करें कि आप ग्राहक पक्ष पर result = eval('(' + json + ')'); जैसे कुछ का उपयोग कर JSON को पार्स कर रहे हैं।

  2. पूर्व कन्वर्ट अपने IFN/नेन स्ट्रिंग मूल्यों ('इन्फिनिटी' और 'NaN') में महत्व देता है, और जब आप जावास्क्रिप्ट में उन मूल्यों के साथ काम करने जा रहे हैं, तो निम्न निर्माण का उपयोग करें: var number1 = (+numbers.positive_infinity);। यह स्ट्रिंग मान 'इन्फिनिटी' को संख्यात्मक Infinity प्रतिनिधित्व में परिवर्तित करेगा।

9

आप JSON spec के बारे में सही कर रहे हैं:

अंकीय मान के रूप में अंक के अनुक्रम (इस तरह के इन्फिनिटी और NaN के रूप में) की अनुमति नहीं है नहीं दर्शाया जा सकता।

समाधान भी कल्पना से आना चाहिए, क्योंकि एक कस्टम "JSON" एनकोडर वैसे भी मान्य JSON का उत्पादन नहीं होगा (आप एक कस्टम विकोडक के रूप में अच्छी तरह से लिखने के लिए होता है, और उसके बाद आप और आपके डेटा के उपभोक्ताओं होगा समय के अंत तक इसका उपयोग करने के लिए मजबूर)।

यहाँ 'क्या कल्पना मूल्यों के लिए अनुमति देता है:

false null true 
:

एक JSON मूल्य एक वस्तु, सरणी, नंबर, या स्ट्रिंग, या निम्नलिखित तीन शाब्दिक नामों में से एक होना चाहिए

तो, किसी भी वर्कअराउंड जिसमें कस्टम JSON- जैसे प्रोटोकॉल के बजाय कानूनी JSON शामिल है, संख्याओं के बजाय कुछ और उपयोग करना शामिल होगा।

इन बढ़ते मामलों के लिए स्ट्रिंग "Infinity" और "NaN" का उपयोग करने का एक उचित विकल्प होगा।

+1

+1 कल्पना का हवाला देते हुए और शाब्दिक उल्लेख के लिए। हालांकि, दूसरे उत्तर को स्वीकार करते हुए, क्योंकि यह उन्हें वापस संख्याओं में बदलने का तरीका सुझाता है। – Septagram

10

यह मेरी राय में जेएसओएन की एक बड़ी कमी है। विभिन्न JSON एनकोडर अलग ढंग से इस संभाल, एक त्वरित अवलोकन यहां पाया जा सकता: http://lavag.org/topic/16217-cr-json-labview/?p=99058

एक समाधान + inf एन्कोड करने के लिए है + 1e9999 कि स्वाभाविक रूप से होगा अतिप्रवाह सबसे डिकोडर में + inf के रूप में, और -inf के साथ एक ही रूप में -1e9999 के रूप में । NaN बहुत कठिन है।

0

ऊपर वर्णित चेतावनी, PHP दस्तावेज़ीकरण में आधिकारिक बग की सूचना दी गई है।

https://bugs.php.net/bug.php?id=64695

0

एक अद्यतन के रूप में पीएचपी> = 5.5.0 के नए संस्करण के लिए इस सवाल का पाठकों के लिए, प्राप्त करने के लिए json_encode से INF या NAN मूल्यों 0 बजाय json_encode बिल्कुल उत्पादन करने में नाकाम रहने के रूप में एन्कोड करने की, JSON_PARTIAL_OUTPUT_ON_ERROR विकल्प जोड़ें।

एक उदाहरण के रूप: json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);

संबंधित मुद्दे