2012-11-10 16 views
9

यह दोषपूर्ण JSON को प्रबंधित या सही करने के तरीके के बारे में नहीं है, यह उस उपयोगकर्ता को समझाने के तरीके के बारे में है जहां त्रुटि दोषपूर्ण JSON में है।दोषपूर्ण JSON पार्सिंग और त्रुटि प्रदर्शित करने में सक्षम होने के लिए

क्या JSON में कौन सी स्थिति पार्सर विफल हुई है, यह जानने का कोई तरीका है।

मैं इस समस्या को node.js एप्लिकेशन में हल करना चाहता हूं, इसलिए यदि संभव हो तो कृपया अपने उत्तर उस डोमेन में रखें।

जब मैं एक दोषपूर्ण JSON के लिए JSON ऑब्जेक्ट और पार्स विधि में बनाया का उपयोग मैं केवल अपवाद संदेश SyntaxError: Unexpected string मिलता है। मैं यह जानना चाहता हूं कि त्रुटि कहां हुई।

पसंदीदा JSON.validate(json) होगा जो परिणाम ठीक/त्रुटि और त्रुटि स्थिति लौटा दिया। कुछ इस तरह:

var faultyJsonToParse = '{"string":"value", "boolean": true"}'; 
var result = JSON.validate(faultyJsonToParse); 
if (result.ok == true) { 
    console.log('Good JSON, well done!'); 
} else { 
    console.log('The validator found a \'' + result.error + '\' of type \'' + result.errorType + '\' in your JSON near position ' + result.position); 
} 

के वांछित परिणाम ऊपर होगा:

The validator found a 'SyntaxError' of type 'Unexpected string' in your JSON near position 35. 
+0

आप एक minified JSON स्ट्रिंग में एक सूचकांक जहां त्रुटि हुई उम्मीद कर रहे हैं मुझे लगता है कि रिटर्न clarinet's parser का उपयोग कर एक छोटे उपयोगिता का निर्माण किया है? – Aesthete

+0

हां, ऐसा कुछ। मुझे लगता है कि एक बड़े JSON में समस्या का एक मार्ग भी हो सकता है। – javabeangrinder

+0

ये .. शायद इस के माध्यम से पढ़ा है .. https://bugzilla.mozilla.org/show_bug.cgi?id=507998 यह शायद आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह कुछ अंतर्दृष्टि दे सकता है कि यह कार्यक्षमता क्यों नहीं है मूल रूप से मौजूद है। – Aesthete

उत्तर

13

jsonLint का प्रयास करें:

var faultyJsonToParse = '{"string":"value", "boolean": true"}'; 

try { 
    jsonlint.parse(faultyJsonToParse) 
} catch(e) { 
    document.write('<pre>' + e) 
} 

परिणाम:

Error: Parse error on line 1: 
...ue", "boolean": true"} 
-----------------------^ 
Expecting 'EOF', '}', ',', ']', got 'undefined' 

(हालांकि jsonLint एक नोड परियोजना है, यह भी वेब में इस्तेमाल किया जा सकता है: बस https://github.com/zaach/jsonlint/blob/master/web/jsonlint.js हड़पने)

के रूप में @ EH9 सुझाव दिया, विस्तृत अपवाद जानकारी प्रदान करने के लिए मानक जेसन पार्सर के चारों ओर एक रैपर बनाने का अर्थ है:

JSON._parse = JSON.parse 
JSON.parse = function (json) { 
    try { 
     return JSON._parse(json) 
    } catch(e) { 
     jsonlint.parse(json) 
    } 
} 

JSON.parse(someJson) // either a valid object, or an meaningful exception 
2

निर्मित JSON.parse() के संस्करणों संगत व्यवहार नहीं है। यह सुसंगत है जब तर्क अच्छी तरह से गठित होता है, और यदि यह नहीं है तो असंगत है। यह मूल JSON लाइब्रेरी कार्यान्वयन में इस फ़ंक्शन के अपूर्ण विनिर्देश पर वापस चला जाता है। विनिर्देश अधूरा था क्योंकि यह अपवाद वस्तुओं के लिए एक इंटरफ़ेस परिभाषित नहीं किया था। और यह स्थिति सीधे आपके प्रश्न की ओर ले जाती है।

हालांकि मुझे इस समाधान के बारे में पता नहीं है कि इस समय ऑफ-द-शेल्फ है, समाधान को एक JSON पार्सर लिखने और त्रुटि प्रबंधन के लिए स्थिति की स्थिति को ट्रैक करने की आवश्यकता है। इसे आपके मौजूदा कोड में निर्बाध रूप से डाला जा सकता है (1) पहले मूल संस्करण का आह्वान करते हुए, और (2) यदि मूल संस्करण अपवाद फेंकता है, तो स्थिति-जागरूक संस्करण (यह धीमा हो जाएगा) को आवेदक को फेंकने दें आपका स्वयं का कोड मानकीकृत करता है।

1

यदि आप नोडजेएस का उपयोग कर रहे हैं, तो क्लेरनेट एक बहुत अच्छा ईवेंट-आधारित JSON पार्सर है जो आपको बेहतर त्रुटि संदेश (रेखा और कॉलम या त्रुटि) उत्पन्न करने में मदद करेगा।

snippet (string): the actual line where the error happened 
line (number) : the line number of the error 
column (number) : the column number of the error 
message (string): the parser's error message 

कोड यहाँ है: https://gist.github.com/davidrapin/93eec270153d90581097

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

  • कोई संबंधित समस्या नहीं^_^