পাইথনে কোনও স্ট্রিং বৈধ JSON কিনা তা আমি কীভাবে চেক করব?


183

পাইথন-এ, কোনও স্ট্রিং পার্স করার চেষ্টা করার আগে কোনও স্ট্রিং বৈধ জেএসওএন কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ ফেসবুক গ্রাফ এপিআই এর মতো জিনিসগুলির সাথে কাজ করা, কখনও কখনও এটি জেএসএনকে ফেরত দেয়, কখনও কখনও এটি কোনও চিত্র ফাইল ফেরত দিতে পারে।


3
এপিআই-তে সামগ্রীর প্রকারটি নির্ধারণ করা উচিত
জন লা রুই

4
আপনি API কল এ কোন ডেটা ফিরিয়ে দেওয়া হচ্ছে তা নির্দিষ্ট করতে পারবেন না? আমি ফেসবুক এপিআইয়ের সাথে পরিচিত নই তবে এটি সত্যিই অদ্ভুত শোনায়।
জোকিং করা

আমি একবার করেছি, কিন্তু সঙ্গে codegolf উপায়
আপনি

1
বেশিরভাগ প্রতিক্রিয়া হ'ল জসন, তবে, আপনি যদি প্রোফাইল ফটোতে কল করেন তবে এটি কেবল jpg ফেরত দেয়
জোয় ব্লেক

উত্তর:


233

আপনি json.loads()যা করার চেষ্টা করতে পারেন , যা ValueErrorআপনার পাশ করা স্ট্রিংটি JSON হিসাবে ডিকোড করতে না পারলে এটি ছুঁড়ে যাবে।

সাধারণভাবে, " Pythonic অবস্থা এই ধরনের জন্য" দর্শনের বলা হয় EAFP জন্য আরো সহজ অনুমতির চেয়ে ক্ষমা চাইতে বললেন


4
আমি দেখতে পাচ্ছি যে এটি কীভাবে কাজ করবে। আমাকে আমার পরবর্তী প্রশ্নের দিকে নিয়ে যায়। এটি একটি ValueError নিক্ষেপ করে। আমি এই মুহুর্তে এটি যা করতে চাই তা হ'ল আপত্তিকর স্ট্রিংটি ফিরিয়ে আনা যাতে আমি এটির সাথে আরও কিছু করতে পারি। এখনও অবধি, আমি কেবল ত্রুটি বার্তা এবং টাইপ পেয়েছি।
জোয়ে ব্লেক

2
আপনি যে স্ট্রিংটি দিয়ে গেছেন loadsসেগুলি বাদ দিয়ে অন্যটি ধারা বাদ দিয়ে কী হয়েছে?
জন ফ্ল্যাটনেস

1
এটির সাথে কোনও ভুল নেই, আমার পক্ষ থেকে একটি ভুল ভুল mistake এটি প্রদর্শিত হয় আমি কেবল কল ফাইল করতে পারি না read তবে আমি একটি পরিবর্তনশীল সেট করতে এবং এটি ব্যবহার করতে পারি। এবং আমি কি করেছি তা না।
জোয়ে ব্লেক

5
কেবল একটি নোট ... json.loads ('10 ') মান মানককে ফেলে দেয় না এবং আমি নিশ্চিত' 10 'একটি বৈধ
জাসন

4
এই ধারণাটি সত্ত্বেও যে JSON পাঠ্যটি অবশ্যই একটি অ্যারে বা অবজেক্ট হওয়া উচিত, বেশিরভাগ এনকোডার এবং ডিকোডার (পাইথনের সহ) সংখ্যা এবং স্ট্রিং সহ "শীর্ষে" কোনও JSON মান সহ কাজ করবে। 10একটি বৈধ JSON নম্বর মান।
জন ফ্ল্যাটনেস

144

উদাহরণ পাইথন স্ক্রিপ্টটি একটি বুলিয়ান দেয় যদি কোনও স্ট্রিং বৈধ জেএসন হয়:

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/

পাইথন জেএসএন মডিউলে দুর্দান্ত টিউটোরিয়াল: 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 সিনট্যাক্স চেকিং, পার্সিং, প্রশংসাপত্র, এনকোডিং, ডিকোডিং এবং আরও অনেক কিছুতে সক্ষম:

https://metacpan.org/pod/json_xs


আপনার কি মনে হয় আমাদের del json_objectএকবার যাচাই করা উচিত ?
অক্ষয়

4
নরক কেন সেখানে সঠিক বৈধতা পদ্ধতি নেই? ক্যানারি না মেরে ত্রুটি পরীক্ষা করার একটি উপায় থাকতে হবে।
ব্র্যাডেন সেরা

আমি যা পাচ্ছি তা হ'ল: পাইথন ওওকে অনুমতি দেয় তার অর্থ এই নয় যে অন্যান্য অংশগুলি উপেক্ষা করা ঠিক আছে। আমার কাছে এ। এর বিকল্প থাকা উচিত যা ফাংশনটি ব্যর্থ হতে দেয় এবং ব্যতিক্রমগুলি (ওও / পাইথন উপায়) ব্যবহার করে, বা বি একটি ফাংশন কল করে যা কোনও ব্যতিক্রম ছোঁড়ার পরিবর্তে কোনও মান (সাফল্য বা ত্রুটি) দেয় এবং তারপরে আমার ফাংশন রাখে , পরিবর্তে, একটি ত্রুটি নির্দেশ করে এমন একটি সেন্ডিনেল মান ফিরিয়ে দিন, যাতে ত্রুটিগুলি কল স্ট্যাককে বুদবুদ করে এবং প্রয়োজনীয় হিসাবে ব্যবহৃত হতে পারে (পদ্ধতিগত / সি উপায়)। সি ++ আপনাকে যেমন ব্যতিক্রমগুলি ব্যবহার করতে বাধ্য করে না (আপনি এর্নো ব্যবহার করতে পারেন) ঠিক তেমনি পাইথনও এটিকে জোর করবেন না
ব্র্যাডেন বেস্ট

@ ব্র্যাডেনবেস্ট জেএসএন স্ট্রিংয়ের বৈধতা রাক্ষস দ্বারা ভুতুড়ে যা থামানো সমস্যাটিকে আকর্ষণীয় করে তুলেছে। কোনও স্ট্রিংকে সঠিকভাবে প্রমাণ করার মতো কোনও গাণিতিকভাবে সঠিক উপায় নেই পার্সার দিয়ে আপনার স্ট্রিংটি চেষ্টা করে দেখুন এবং এটি ত্রুটি ছাড়াই শেষ হয়েছে কিনা। এটি কেন শক্ত তা দেখতে: "আমাকে এমন একটি প্রোগ্রাম লিখুন যা প্রমাণ করে যে কোনও কম্পিউটার প্রোগ্রামে সিনট্যাক্স ত্রুটি নেই exist" এটা সম্ভব না. ভাষা বিকাশকারীরা এনকোডিং এবং ডিকোডিংয়ের চিরন্তন অস্ত্রের دوڑ সম্পর্কে কাব্যিক মোম করবে। আমরা সর্বোত্তমভাবে করতে পারি হ্যাঁ / না ফেরত যদি কোনও স্ট্রিং কোনও সম্ভাব্য ইঞ্জিনের জন্য নয় তবে প্রদত্ত ইঞ্জিনের জন্য বৈধ হয়।
এরিক লেসচিনস্কি

1
@ এরিকলিশচিনস্কি কিন্তু এখানে কোনও থামার সমস্যা নেই। JSON পার্স করার সময় কোনও ত্রুটি ঘটলে প্রোগ্রামটি স্পষ্টভাবে একটি ব্যতিক্রম উত্থাপন করে। সুতরাং, JSON ইনপুটটি কখন অবৈধ তা প্রোগ্রামটি জানে। সুতরাং, কোনও ফাংশন থাকা 100% সম্ভব যা ইনপুটটি ব্যবহার না করে বৈধ কিনা তা পরীক্ষা করে try। #SopCanaryAbuse
ব্র্যাডেন সেরা

2

আমি বলব এটি পার্সিং করা একমাত্র উপায় যা আপনি সত্যিই সম্পূর্ণরূপে বলতে পারেন। json.loads()সঠিক ফর্ম্যাটটি না থাকলে পাইথনের ফাংশন (প্রায় অবশ্যই) ব্যতিক্রম উত্থাপিত হবে। যাইহোক, আপনার উদাহরণের উদ্দেশ্যগুলি আপনি সম্ভবত প্রথমে দ্য-হোয়াইটস্পেস অক্ষরগুলির প্রথম কয়েকটিকে পরীক্ষা করতে পারেন ...

আমি ফেসবুকটি যে JSON ফেরত পাঠায় তার সাথে আমি পরিচিত নই, তবে ওয়েব অ্যাপ্লিকেশন থেকে বেশিরভাগ জেএসএন স্ট্রিং একটি খোলা স্কোয়ার [বা কোঁকড়ানো {বন্ধনী দিয়ে শুরু হবে will এই অক্ষরগুলি দিয়ে শুরু করার মতো কোনও চিত্রের বিন্যাস আমার জানা নেই।

বিপরীতে যদি আপনি জানেন যে কোন চিত্রের ফর্ম্যাটগুলি প্রদর্শিত হতে পারে তবে আপনি তাদের স্বাক্ষরগুলির জন্য চিত্রগুলি সনাক্ত করতে স্ট্রিংয়ের শুরুটি চেক করতে পারেন এবং ধরে নিতে পারেন যে এটি কোনও চিত্র না হলে JSON রয়েছে।

পাঠ্য স্ট্রিংয়ের পরিবর্তে গ্রাফিক সনাক্তকরণের জন্য আরও একটি সহজ হ্যাক, আপনি যখন গ্রাফিকটি সন্ধান করছেন সেক্ষেত্রে স্ট্রিংয়ের কয়েক ডজন অক্ষরের প্রথম দু'এই ASCII অক্ষরের জন্য পরীক্ষা করা (জেএসওনকে ASCII মনে করে )।


0

আমি এই সমস্যাটির একটি জেনেরিক, আকর্ষণীয় সমাধান নিয়ে এসেছি:

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

1
আমি মনে করি সাধারণ সমাধানগুলি ভাল তবে এই ক্ষেত্রে, exceptধারাটি কোনও গুরুতর ব্যতিক্রম আড়াল করতে পারে। ব্যতিক্রম ক্যাপচারগুলি যথাসম্ভব সীমাবদ্ধ হওয়া উচিত।
lucastamoios
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.