2011-12-05 10 views
56

होना चाहिए, मुझे यह त्रुटि मिली, और मुझे इस प्रश्न का कोई उचित उत्तर नहीं मिला, इसलिए मैंने सोचा कि मैं समस्या का सारांश लिखूंगा।एक JSON टेक्स्ट में कम से कम दो ऑक्टेट्स

आप आईआरबी में इस स्निपेट चलाते हैं:

JSON.parse(nil) 

आपको निम्न त्रुटि दिखाई देंगे:

TypeError: can't convert nil into String 

मैं तरह का समारोह उम्मीद कर रहा था nil वापस जाने के लिए, और नहीं एक TypeError

JSON::ParserError: A JSON text must at least contain two octets! 

कि ठीक है और अच्छी तरह है: आप to_s का उपयोग कर सभी इनपुट कन्वर्ट है, तो आप ओकटेट त्रुटि दिखाई देगी। आप नहीं जानते कि क्या एक ओकटेट है, एक सारांश और समाधान के लिए इस पोस्ट पढ़ें: What is a JSON octet and why are two required?

समाधान

चर आप में गुजर रहे एक खाली स्ट्रिंग है। JSON.parse विधि में खाली स्ट्रिंग का उपयोग करने का प्रयास न करें।

प्रश्न

तो, अब मैं त्रुटि का कारण पता है, क्या पैटर्न का उपयोग करना चाहिए इस संभाल करने के लिए? मैं nil मानों को अनुमति देने के लिए जेएसओएन लाइब्रेरी को बंदर पैच करने के लिए थोड़ा नाराज हूं। किसी भी सुझाव के लिए बहुत आभार होगा।

+2

'" "' है, जो दो ऑक्टेट है। जो भी लिखा हो सकता है कि एन्कोडर/पार्सर ने यह नहीं माना कि 'शून्य' भी वैध जावास्क्रिप्ट मान है। –

उत्तर

41
parsed = json && json.length >= 2 ? JSON.parse(json) : nil 

लेकिन वास्तव में पुस्तकालय इस मामले को संभालने और शून्य वापस करने में सक्षम होना चाहिए। अंतर्निहित जेएसओएन समर्थन वाले वेब ब्राउज़र बस काम करने लगते हैं जैसे आप उम्मीद करते हैं।


या एक केवल थोड़ा दखल मिनी पैच के साथ यह करने के लिए:

module JSON 
    def self.parse_nil(json) 
    JSON.parse(json) if json && json.length >= 2 
    end 
end 

parsed = JSON.parse_nil(json) 
+0

हां, हालांकि मुझे इसे हर जगह दोहराना होगा, मैं पार्स करने का प्रयास करता हूं। शायद मुझे एक पैच जमा करना चाहिए। – Cory

+0

JSON मॉड्यूल में एक छोटा मिनी पैच जोड़ा गया जिसके बजाय आप इसका उपयोग कर सकते हैं। इसमें जादू या कुछ भी अलौकिक विधि शामिल नहीं है, और आसानी से पुन: प्रयोज्य है। –

+0

@Alex पूरे ऐप में इसे पकड़ने के लिए आप मिनी पैच को कहाँ तैनात करेंगे? – RSG

0
hash = JSON.parse(json) rescue {} 
array = JSON.parse(json) rescue [] 
string = JSON.parse(json) rescue '' 
+9

के अंदर इसे स्वीकार करने से पहले यह बहुत खराब है यह किसी अन्य प्रकार की पार्सर त्रुटि सहित कुछ भी बचाएगा जिसे आप शायद जानना चाहते हैं। –

+0

सच है। आपको यह पता होना चाहिए और यह तय करना चाहिए कि यह किस मामले में उपयोगी है ... – Ich

3

अनुसार json.org को

JSON दो संरचनाओं पर बनाया गया है:

  1. नाम/मूल्य का संग्रह ई जोड़े विभिन्न भाषाओं में, यह एक वस्तु, रिकॉर्ड, संरचना, शब्दकोश, हैश तालिका, कुंजी सूची, या सहयोगी सरणी के रूप में महसूस किया जाता है।

  2. मूल्यों की एक आदेशित सूची। अधिकांश भाषाओं में, यह एक सरणी, वेक्टर, सूची, या अनुक्रम के रूप में महसूस किया जाता है।

तो, कम से कम दो ऑक्टेट (8 बिट) शीर्ष स्तर पर आवश्यक होगा {} या []

IMO, सबसे अच्छा समाधान के लिए सुनिश्चित करने के लिए JSON.parse तर्क है बनाने के लिए किया जाएगा या तो एक strigified वस्तु या एक strigified सरणी।(`{}` और निरपेक्ष न्यूनतम वस्तु है) :-)

+0

यह अब सत्य नहीं है। मार्च 2014 से एक [आरएफसी 715 9] (https://tools.ietf.org/html/rfc7159) उन प्रतिबंधों को अद्यतन करता है। सभी अनुवर्ती मान्य JSON हैं: 'null',' false', 'true',' 42', "" कुछ स्ट्रिंग "', '{}', '[]' – Dan

1
data.presence && JSON.parse(data) 

JSON.parse(data.presence || '{}') 
संभवतः तथ्य एक निरपेक्ष न्यूनतम मान्य जावास्क्रिप्ट स्ट्रिंग है कि के कारण
संबंधित मुद्दे