2012-07-02 4 views
12

मेरे पास पायथन में एक स्ट्रिंग है, मैं जानना चाहता हूं कि यह वैध JSON है या नहीं।सत्यापित करें कि कोई स्ट्रिंग पायथन में JSON है या नहीं?

json.loads(mystring) स्ट्रिंग JSON नहीं है, लेकिन मैं अपवाद नहीं पकड़ना चाहता हूं तो एक त्रुटि उठाएगी।

मैं कुछ इस तरह चाहते हैं, लेकिन यह काम नहीं करता:

if type(mysrting) == dict: 
    myStrAfterLoading = json.loads(mystring) 
else: 
    print "invalid json passed" 

मैं पकड़ने के लिए कि ValueError अगर मेरे स्ट्रिंग JSON है देखने के लिए है?

+7

"... लेकिन मैं नहीं करना चाहती अपवाद पकड़ने के लिए। अगर मैं इसका उपयोग करना चाहता हूं, तो ... "पैराफ्रेशिंग:" मैं आसान, स्पष्ट तरीका नहीं जाना चाहता हूं। मैं इसे ऐसे तरीके से करना चाहता हूं जो काम नहीं करता है। " कोई अपराध इरादा नहीं, सिर्फ मजाक कर रहा है! :) –

+0

नहीं, मेरे पास सभी एप्लिकेशन के लिए अपवाद रैपर था। यह वास्तविक त्रुटियों को पकड़ना चाहिए। अगर मैं इसका उपयोग कर सकता हूं, तो मैं इसे पसंद करता हूं .. – eligro

+9

मुझे वह तर्क नहीं मिलता है। आप किसी भी समस्या के बिना कोशिश/छोड़कर कोशिश/छोड़कर उपयोग कर सकते हैं। जैसा कि मैंने कहा, –

उत्तर

20

स्ट्रिंग को सत्यापित करने के लिए इसे पार्सिंग की आवश्यकता होगी - इसलिए यदि आपने चेक किया तो परिवर्तित किया गया तो यह सचमुच दो बार लंबा लगेगा। अपवाद को पकड़ना सबसे अच्छा तरीका है।

try: 
    json_object = json.loads(json_string) 
except ValueError, e: 
    pass # invalid json 
else: 
    pass # valid json 
10

तो ऐसा कोई कारण आप अपवाद को पकड़ने के लिए नहीं करना चाहती है: दिलचस्प है, आप अभी भी एक अगर-किसी और शैली अभिव्यक्ति का उपयोग कर सकते हैं?

प्रकार के लिए ध्यान रखें कि परीक्षण और एक अपवाद को पकड़ने blazingly अजगर में तेजी से हो सकता है, और अक्सर काम करने के pythonic तरीका है, बजाय परीक्षण में रखें (मूल रूप से, विश्वास बतख टाइपिंग और तदनुसार प्रतिक्रिया)।

आराम से थोड़ा अधिक अपने मन रखने के लिए, यहाँ एक बार देख ले: Python if vs try-except

आप अभी भी पठनीयता के बारे में चिंतित हैं, कोड में टिप्पणी जोड़ने के कारण है कि आप कोशिश का उपयोग कर रहे/छोड़कर समझाने के लिए ;)

मैं इस दृष्टिकोण पिछले एक जावा पृष्ठभूमि से आने वाले में अपने आप के साथ संघर्ष किया है, लेकिन इस वास्तव में अजगर में ऐसा करने का सबसे आसान तरीका है ... और सरल जटिल से बेहतर है।

+0

, मेरे पास सभी एप्लिकेशन के लिए अपवाद रैपर था। मैं इसे तत्काल त्रुटियों को पकड़ना चाहता हूं ताकि मैं उन्हें 1 स्थान से संभाल सकूं। अगर अन्यथा कोड पर मेरा अधिक नियंत्रण देता है और यह सुनिश्चित करने के लिए कि मैंने कुछ को छोड़कर नहीं किया है क्योंकि एनोटर कारण .. – eligro

+1

फिर कोड के न्यूनतम ब्लॉक को संभव/प्रयास करें। आप अपने कोड पर अपवाद रैपर रख सकते हैं और कोशिश कर सकते हैं/सिवाय इसके कि इसका उपयोग सभी के लिए किया जाना है। – pcalcao

+5

@ एलीग्रो: ऐसा लगता है जैसे आपको लगता है कि आप केवल एक ही स्थान पर अपवाद पकड़ सकते हैं, या केवल पूरे एप्लिकेशन के लिए। यह एक ऐसा स्थान है जहां आप एक विशिष्ट अपवाद पकड़ना चाहते हैं क्योंकि यह * विशिष्ट उपयोगकेस * फिट बैठता है। 'प्रयास: छोड़कर' के प्रदर्शन फायदे के संदर्भ देने के लिए –

30

सही उत्तर है: ValueError को पकड़ना नहीं चाहते हैं।

उदाहरण अजगर स्क्रिप्ट एक बूलियन लौटाता है यदि एक स्ट्रिंग मान्य JSON है:

import json 

def is_json(myjson): 
    try: 
     json_object = json.loads(myjson) 
    except ValueError, e: 
     return False 
    return True 

print is_json('{}')    # prints True 
print is_json('{asdf}')   # prints False 
print is_json('{"age":100}')  # prints True 
print is_json('{'age':100 }') # prints False 
print is_json('{"age":100 }') # prints True 
+0

'TypeError: JSON ऑब्जेक्ट str होना चाहिए, 'प्रतिक्रिया' को यह त्रुटि नहीं मिली – TomSawyer

+0

u'1589649418441381790 'जैसी एकल यूनिकोड स्ट्रिंग पर मान्य करने में विफल रहता है, कोई विचार क्यों? – lifelogger

-3

क्यों पार्स इस प्रकार जब आप प्रकार का उपयोग कर सकते हैं:

def is_json(myjson): 
    return type(myjson) == type({}) 

def is_json_arr(myjson): 
    return type(myjson) == type([{}]) 
+0

ओपी यह जांचना चाहता है कि स्ट्रिंग में वैध JSON है या नहीं। एक स्ट्रिंग कभी भी 'टाइप (myjson) == प्रकार ({}) 'को संतुष्ट नहीं करेगी। – jwodder

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