पायथन में, क्या यह जांचने का एक तरीका है कि क्या स्ट्रिंग को पार्स करने से पहले JSON वैध है?
उदाहरण के लिए, फेसबुक ग्राफ एपीआई जैसी चीजों के साथ काम करने पर, कभी-कभी यह JSON को लौटा देता है, कभी-कभी यह एक छवि फ़ाइल लौटा सकता है।
पायथन में, क्या यह जांचने का एक तरीका है कि क्या स्ट्रिंग को पार्स करने से पहले JSON वैध है?
उदाहरण के लिए, फेसबुक ग्राफ एपीआई जैसी चीजों के साथ काम करने पर, कभी-कभी यह JSON को लौटा देता है, कभी-कभी यह एक छवि फ़ाइल लौटा सकता है।
जवाबों:
आप करने की कोशिश कर सकते हैं json.loads()
, जो ValueError
कि यदि स्ट्रिंग आपके पास से गुजरती है तो JSON के रूप में डिकोड नहीं किया जा सकता है।
सामान्य तौर पर, इस तरह की स्थिति के लिए " पायथोनिक " दर्शन को ईएएफपी कहा जाता है , अनुमति के लिए आसान करने के लिए माफ़ी मांगना ।
loads
सिवाय क्लॉज में पास हुए स्ट्रिंग को वापस करने में क्या गलत है ?
10
एक वैध JSON नंबर मान है।
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as 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
print is_json('{"age":100 }') #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
एक JSON स्ट्रिंग को पायथन डिक्शनरी में बदलें:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
एक अजगर वस्तु को JSON स्ट्रिंग में बदलें:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
यदि आप निम्न-स्तरीय पार्सिंग तक पहुँच चाहते हैं, तो अपना रोल न करें, किसी मौजूदा लाइब्रेरी का उपयोग करें: http://www.json.org/
अजगर JSON मॉड्यूल पर महान ट्यूटोरियल: https://pymotw.com/2/json/
sudo cpan JSON::XS
echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json
json_xs -t none < myjson.json
प्रिंटों:
, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.
json_xs
वाक्यविन्यास जाँच, पार्सिंग, प्रिटिटाइजिंग, एन्कोडिंग, डिकोडिंग और बहुत कुछ करने में सक्षम है:
del json_object
एक बार मान्य होना चाहिए ?
try
। #StopCanaryAbuse
मैं कहूंगा कि यह एकमात्र तरीका है जिसे आप वास्तव में पूरी तरह से बता सकते हैं। json.loads()
यदि सही प्रारूप नहीं है तो अपवाद पायथन के कार्य द्वारा उठाया जाएगा (लगभग निश्चित रूप से)। हालांकि, आपके उदाहरण के उद्देश्य आप शायद गैर-व्हाट्सएप पात्रों के पहले जोड़े की जांच कर सकते हैं ...
मैं उस JSON से परिचित नहीं हूं जिसे facebook वापस भेजता है, लेकिन वेब ऐप्स से अधिकांश JSON तार एक खुले वर्ग [
या घुंघराले {
ब्रैकेट के साथ शुरू होगा । कोई चित्र प्रारूप नहीं जिन्हें मैं उन पात्रों के साथ शुरू करना जानता हूं।
इसके विपरीत यदि आप जानते हैं कि छवि प्रारूप क्या दिखा सकते हैं, तो आप छवियों को पहचानने के लिए उनके हस्ताक्षर के लिए स्ट्रिंग की शुरुआत की जांच कर सकते हैं, और मान लें कि आपके पास JSON है यदि यह छवि नहीं है।
एक ग्राफिक की पहचान करने के लिए एक और सरल हैक, एक टेक्स्ट स्ट्रिंग के बजाय, जिस मामले में आप एक ग्राफिक की तलाश कर रहे हैं, वह सिर्फ स्ट्रिंग के दर्जन भर पात्रों के पहले जोड़े में गैर-एएससीआईआईआई पात्रों के लिए परीक्षण करना है (यह मानते हुए कि JSON ASCII है )।
मैं इस समस्या का एक सामान्य, दिलचस्प समाधान लेकर आया हूं:
class SafeInvocator(object):
def __init__(self, module):
self._module = module
def _safe(self, func):
def inner(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
return None
return inner
def __getattr__(self, item):
obj = getattr(self.module, item)
return self._safe(obj) if hasattr(obj, '__call__') else obj
और आप इसे इस तरह से उपयोग कर सकते हैं:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
खंड किसी भी गंभीर अपवाद को छिपा सकता है। कैचिंग अपवादों को यथासंभव प्रतिबंधात्मक होना चाहिए।