برنامه نویسی ۶۴۱۶ بازدید

جیسون، عبارت اختصاری برای «نمادگذاری اشیای جاوا اسکریپت» (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 جیسون فلیکر را مشاهده کنید.

آیا شما از جیسون در خدماتی که دریافت یا ارائه می‌کنید، استفاده کرده‌اید؟ آیا به برنامه‌نویسی پایتون علاقه‌مند هستید؟ در هر صورت اگر به این مطلب علاقه‌مند بوده‌اید، از آموزش‌های زیر نیز می‌توانید بهره بگیرید:

==

بر اساس رای ۱۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر