2013-04-19 13 views
8

मुझे किसी तीसरे पक्ष से एक बीमार गठित JSON स्ट्रिंग भेजा जा रहा है। मैंने जावास्क्रिप्ट ऑब्जेक्ट में इसे पार्स करने के लिए JSON.parse(str) का उपयोग करने का प्रयास किया लेकिन यह निश्चित रूप से विफल रहा।पार्स बीमार गठित JSON स्ट्रिंग

कारण किया जा रहा है कि कुंजी तार नहीं हैं:

{min: 100} 

के रूप में मान्य JSON स्ट्रिंग (जो ठीक से पार्स) करने का विरोध किया:

{"min": 100} 

मैं बीमार का गठन स्ट्रिंग स्वीकार करने की जरूरत अभी के लिए। मुझे लगता है कि सही ढंग से उद्धरण कुंजी भूलना भूलना एक आम गलती है। क्या इसे वैध JSON स्ट्रिंग में बदलने का कोई अच्छा तरीका है ताकि मैं इसे पार्स कर सकूं? अभी के लिए मुझे चरित्र द्वारा चरित्र को पार्स करना होगा और ऑब्जेक्ट को आज़माकर बनाना होगा, जो भयानक लगता है।

विचार?

+0

ऐसा लगता है कि यहां कुछ समाधान हैं: http://stackoverflow.com/questions/4210160/safely-parsing-a-json-string-with-unquoted-keys?rq=1 – showdev

+0

मुझे लगता है कि एक फ़ंक्शन कन्स्ट्रक्टर का उपयोग करना इस मामले में काम करना चाहिए: 'var data = new function ('return' + illFormedJSON;)()' – m90

+1

'(?: [az] +): + 'मैं सभी गैर उचित कुंजी के लिए खोज कहूंगा। यह शुरू करने के लिए आपको एक जगह देने के लिए एक पूर्ण regex नहीं है। प्रश्न का पूरी तरह उत्तर देने के लिए समय नहीं है। – travis

उत्तर

5

आप केवल eval सकता है, लेकिन अगर आप स्रोत पर भरोसा नहीं करते हैं तो यह बुरा सुरक्षा अभ्यास होगा। बेहतर समाधान या तो कुंजियों को उद्धृत करने के लिए मैन्युअल रूप से स्ट्रिंग को संशोधित करना होगा या किसी अन्य उपकरण के किसी टूल का उपयोग करना होगा जो आपके लिए यह करता है (https://github.com/daepark/JSOL डाएपार्क द्वारा लिखित) देखें।

+0

ने https://github.com/daepark/JSOL का उपयोग किया, जो एक Node.js मॉड्यूल में परिवर्तित हो गया। – lostintranslation

1

और क्या JSON में है पर निर्भर करता है, तो आप बस एक तार की जगह और '{"' और ':''":' साथ साथ '{' की जगह कर सकता है।

2

मैं इस अभी हाल ही में किया था, का मूल्यांकन करने के Uglifyjs का उपयोग कर:

var jsp = require("uglify-js").parser; 
var pro = require("uglify-js").uglify; 

var orig_code = "var myobject = " + badJSONobject; 
var ast = jsp.parse(orig_code); // parse code and get the initial AST 
var final_code = pro.gen_code(ast); // regenerate code 

$('head').append('<script>' + final_code + '; console.log(JSON.stringify(myobject));</script>'); 

यह वास्तव में एक तरह से खराब है, और एक eval() आधारित समाधान के रूप में सभी एक ही समस्या है, लेकिन आप केवल करने की आवश्यकता है डेटा को एक बार पार्स/दोबारा सुधारें, फिर उपर्युक्त आपको जेएस ऑब्जेक्ट की एक साफ JSON प्रति प्राप्त करनी चाहिए।

+1

एफडब्ल्यूआईडब्ल्यू, यह करने के सबसे धीमे तरीकों में से एक होगा। Uglify एक पूर्ण उड़ा जावास्क्रिप्ट पार्सर है; स्वयं स्ट्रिंग में हेरफेर करना (उदा। http://stackoverflow.com/a/16110830/444991) * अधिक * अधिक कुशल होगा। – Matt

+0

हां, यह दृष्टिकोण एक रीयलटाइम एप्लिकेशन की बजाय ग्रंट-स्टाइल बिल्ड स्क्रिप्ट के लिए डिज़ाइन किया गया था, जहां दक्षता चिंता का विषय है। – BishopZ

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