JSON برای پایتون – راهنمایی برای مبتدیها


جیسون، عبارت اختصاری برای «نمادگذاری اشیای جاوا اسکریپت» (JavaScript Object Notation) و یک قالب مبتنی بر متن است که امکان تبادل دادهها بین برنامههای مختلف را تسهیل میکند. برای نمونه یک برنامهای که در C++ نوشته شده است و روی ویندوز اجرا میشود، میتواند به راحتی با استفاده از جیسون دادهها را با برنامهای در پایتون نوشته شده و بر روی لینوکس اجرا میشود، مبادله کند. سادگی و انعطافپذیری این قالب منجر به استفاده گسترده از آن در سالهای اخیر شده است و در سالهای اخیر به طور خاص بر قالبهای مبتنی بر XML قدیمی ترجیح داده میشود.
کتابخانهها و کیت ابزارهای تجزیه (Parse) و تولید جیسون در تقریباً همه زبانها و محیطهای برنامهنویسی وجود دارند. این نوشته بر روی روشها و مشکلات ناشی از پردازش جیسون با استفاده از پایتون متمرکز شده است.
برخی نمونههای جیسون
رایجترین نهاد جیسون که با آن مواجه میشوید object یا شیء است.
شیء در واقع یک مجموعه از نگاشت «کلید: مقدار» است که به شکل زیر نمایش مییابد:
person.json: { "firstName": "Alice", "lastName": "Hall", "age": 35 }
در ادامه شیوه نمایش یک آرایه از اشیا را مشاهده میکنید. در این نمایش هر آیتم در آرایه در واقع یک شیء است. این نمونهای از حقوق بازیکنان بیسبال است.
salaries.json: [{ "year": 1985, "teamId": "ATL", "leagueId": "NL", "playerId": "barkele01", "salary": 870000 }, { "year": 1985, "teamId": "ATL", "leagueId": "NL", "playerId": "bedrost01", "salary": 550000 } ]
البته شما میتوانید آرایهای از مقادیر اسکالر را نیز نمایش دهید. این آرایه چیزی شبیه مثال زیر خواهد بود:
[ "hello", "world", 35 ]
تجزیه جیسون در پایتون
پایتون یک ماژول جیسون دارد که از آن هم برای تجزیه و هم تولید جیسون از اشیای پایتون و لیستها میتوان استفاده کرد.
در ادامه قطعه کدی مشاهده میکنید که روش باز کردن یک فایل جیسون و بارگذاری دادهها درون یک متغیر را نشان میدهد.
import json with open('sample.json', 'r') as fp: obj = json.load(fp)
وقتی رشتهای حاوی دادههای جیسون دارید میتوانید آن را با استفاده از کد زیر به یک شیء (یا لیست) پایتون تبدیل کنید:
obj = json.loads("""{ "firstName": "Alice", "lastName": "Hall", "age": 35 }""")
برای تجزیه یک آدرس url جیسون میتوان یک شیء url را با استفاده از urllib2 ایجاد کرد و از متد json.load() مانند قبل استفاده نمود.
import urllib2, json url = urllib2.urlopen('http://site.com/sample.json') obj = json.load(url)
مدیریت خطاها
وقتی جیسون با خطا مواجه شود یک مقدار ValueError دریافت میکنید. میتوان با انجام یک اقدام اصلاحی این خطا را مدیریت کرد.
try: obj = json.loads("""{ "firstName": "Alice", "lastName: "Hall", "age": 35 }""") except ValueError: print "error loading JSON"
تجزیه جیسون در خط فرمان
برخی اوقات لازم است که یک رشته جیسون را در خط فرمان پایتون تجزیه کنیم. مثلاً ممکن است بخواهیم خطاها را بررسی کنیم تا خروجی با تورفتگی مناسب ایجاد کنیم.
cat glossary.json # prints {"glossary": {"GlossDiv": {"GlossList": {"GlossEntry": {"GlossDef": {"GlossSeeAlso": ["GML", "XML"], "para": "A meta-markup language, used to create markup languages such as DocBook."}, "GlossSee": "markup", "Acronym": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Abbrev": "ISO 8879:1986", "SortAs": "SGML", "ID": "SGML"}}, "title": "S"}, "title": "example glossary"}}
برای اینکه از فایل جیسون فوق یک خروجی با تورفتگی مناسب به دست آوریم، باید کارهای زیر را انجام بدهیم:
python -mjson.tool glossary.json # prints { "glossary": { "GlossDiv": { "GlossList": { "GlossEntry": { "Abbrev": "ISO 8879:1986", "Acronym": "SGML", "GlossDef": { "GlossSeeAlso": [ "GML", "XML" ], "para": "A meta-markup language, used to create markup languages such as DocBook." }, "GlossSee": "markup", "GlossTerm": "Standard Generalized Markup Language", "ID": "SGML", "SortAs": "SGML" } }, "title": "S" }, "title": "example glossary" } }
روش لود کردن شیء جیسون درون پایتون چنین است. در این روش تنها مواردی که لازم هستند از حالت فشرده خارج میشوند:
python -c 'import json; fp = open("glossary.json", "r"); obj = json.load(fp); fp.close(); print obj["glossary"]["title"]' # prints example glossary
دسترسی به دادهها
زمانی که دادههای جیسون درون متغیر پایتون لود شدند، میتوانید دادهها را به هر صورتی که در پایتون دوست دارید (و یا حتی به صورت لیست) در آورید. برای مثال دادههای جیسون فوق به صورت زیر در پایتون قابل دسترسی هستند:
firstName = obj["firstName"] lastName = obj["Hall"] age = obj["age"]
انواع داده
انواع داده به طور خودکار از روی دادهها مشخص میشوند. توجه داشته باشید که age به صورت یک عدد صحیح تجزیه میشود.
print type(obj["firstName"]), type(obj["lastName"]), type(obj["age"]) # prints <type 'unicode'> <type 'unicode'> <type 'int'>
جدول تبدیل زیر برای تبدیل جیسون به پایتون استفاده میشود.
تجزیه جیسون با استفاده از یک کلاس سفارشی
شیء جیسون به طور پیشفرض در یک dict پایتون تجزیه میشود. برخی اوقات ممکن است نیاز باشد که یک شیء با کلاس سفارشی از دادههای جیسون ایجاد شود. این کار از طریق تعیین یک تابع object_hook که تبدیل را مدیریت میکند ممکن است. مثال زیر شیوه کار را نشان میدهد. در اینجا یک کلاس سفارشی برای نمایش شیء Person میبینیم:
class Person: def __init__(self, firstName, lastName, age): self.firstName = firstName self.lastName = lastName self.age = age def __str__(self): return '{{"firstName" = "{0}","lastName" = "{1}", "age" = {2}}}'.format(self.firstName, self.lastName, self.age)
وهلهای از این کلاس با تجزیه کردن آرگومانهای مورد نیاز به صورت زیر ایجاد میشود:
person = Person("Crystal", "Newell", 27)
برای استفاده از این وهلههای کلاس در زمان تجزیه جیسون میتوانید از تابع object_hook که به صورت زیر تعریف میشود استفاده کنید: این تابع یک dict پایتون میگیرد و یک شیء با کلاس صحیح باز میگرداند:
def obj_creator(d): return Person(d['firstName'], d['lastName'], d['age'])
اینک میتوانید از این تابع object_hook هنگام فراخوانی تجزیهکننده جیسون استفاده کنید.
with open('sample.json', 'r') as fp: obj = json.load(fp, object_hook = obj_creator) print obj # prints {"firstName" = "Alice","lastName" = "Hall", "age" = 35}
نمونههایی برای استفاده از جیسون
جیسون امروزه بسیار متداول است. وبسایتها و بسترهای ابری SaaS (ارائه نرمافزار به عنوان سرویس) زیادی خروجی جیسون ارائه میدهند که به طور مستقیم در برنامهها میتوان مورد استفاده قرار داد. برخی از انواعی که به طور عمومی در دسترس هستند شامل فهرست زیر هستند:
StackOverflow و StackExchange
در این آدرس لیستی از سؤالات مطرح شده در این انجمن در قالب جیسون در دسترس قرار داده شده است.
گیتهاب
این وبسایت یک API جیسون در آدرس https://developer.github.com/v3 دارد.
فلیکر
در این آدرس https://developer.github.com/v3 هم میتوانید API جیسون فلیکر را مشاهده کنید.
آیا شما از جیسون در خدماتی که دریافت یا ارائه میکنید، استفاده کردهاید؟ آیا به برنامهنویسی پایتون علاقهمند هستید؟ در هر صورت اگر به این مطلب علاقهمند بودهاید، از آموزشهای زیر نیز میتوانید بهره بگیرید:
- آموزش برنامه نویسی پایتون
- آموزش تکمیلی برنامه نویسی پایتون
- آموزش ساختمان داده در پایتون
- آموزش پایتون گرافیکی (رابط های گرافیکی پایتون)
==
باسلام و وقت بخیر
دیتاستی با یه فولدری که شامل تصاویر با پسوند png مثلا case1.png ویه فولدر دیگه هم داره که برای هر تصویر تو فولدر قبلی یه فایل با پسوند json داره مثلا case1.json که شامل ۶تا کلاس انواع بیماری هاست که این تصویر هر کدوم از بیماری ها رو داشته باشه برای این بیماری مختصات نقاطی که اونجاها نشون دهنده بیماری هستند رو اورده
نحوه خواندن فایل json برای هر تصویر طوری که بتونم تصاویر رو لیبل گذاری کنم و بعد به تست و ترین اسپلیت کنم؟