استفاده از پایتون برای کار با JSON

01 آبان 1398
استفاده از پایتون برای کار با JSON

 JSON در پایتون

JSON مخفف JavaScript Object Notation و به معنی «نشانه گذاری شیء جاوا اسکریپت» است که برای ذخیره سازی یا تبادل اطلاعات به کار می رود. یادگیری JSON بسیار ساده است و به زبان برنامه نویسی خاصی وابسته نیست! بلکه فقط نحوه ی نگارش آن بر اساس قوانین شیء جاوا اسکریپت است؛ JSON در حقیقت فقط یک رشته متن است که می تواند در هر زبان برنامه نویسی خوانده شود. این فرمت ابتدا توسط آقای Douglas Crockford معرفی شد. از ویژگی های JSON می توان گفت:

  • داده ها در جفت های name/value ذخیره می شوند
  • داده ها با ویرگول انگلیسی از هم جدا شده اند
  • اشیاء درون Curly braces (کروشه) قرار می گیرند (علامت های {})
  • آرایه ها درون براکت ها قرار می گیرند (علامت های [])

مثالی از یک رشته ی ساده ی JSON:

{ "name":"John" }

یکی از پکیج های زبان پایتون (همان ماژول ها) نیز json نام دارد که مخصوص کار با این رشته ها است بنابراین برای کار با رشته های JSON باید این ماژول را در پروژه ی خود وارد کنید:

import json

Parse (تجزیه) کردن JSON و فرآیند معکوس آن

اگر رشته ی JSON داشته باشید می توانید با استفاده از متد ()json.loads آن را parse (تجزیه) کنید. نتیجه ی این کار تبدیل رشته ی JSON به یک dictionary در پایتون خواهد بود:

import json

# some JSON:
x = '{ "name":"John", "age":30, "city":"New York"}'

# parse x:
y = json.loads(x)

# the result is a Python dictionary:
print(y["age"])

خروجی عدد 30 (سن شخص) خواهد بود.

حالا می توانید همین فرآیند را به صورت معکوس نیز انجام دهید؛ یعنی اگر یک شیء در زبان پایتون داشته باشید می توانید با استفاده از متد ()json.dumps آن را به رشته ی JSON تبدیل کنید:

import json

# a Python object (dict):
x = {
  "name": "John",
  "age": 30,
  "city": "New York"
}

# convert into JSON:
y = json.dumps(x)

# the result is a JSON string:
print(y)

خروجی:

{"name": "John", "age": 30, "city": "New York"}

در واقع شما می توانید تمامی اشیاء زیر در زبان پایتون را به JSON تبدیل کنید:

  • dict
  • list
  • tuple
  • string
  • int
  • float
  • True
  • False
  • None

در کد زیر تمامی این موارد را به شما نشان داده ایم:

import json

print(json.dumps({"name": "John", "age": 30}))
print(json.dumps(["apple", "bananas"]))
print(json.dumps(("apple", "bananas")))
print(json.dumps("hello"))
print(json.dumps(42))
print(json.dumps(31.76))
print(json.dumps(True))
print(json.dumps(False))
print(json.dumps(None))

خروجی به شکل زیر خواهد بود:

{"name": "John", "age": 30}
["apple", "bananas"]
["apple", "bananas"]
"hello"
42
31.76
true
false
null

همانطور که می بینید در این مثال مقادیری که ما در زبان پایتون داشیتم به معادل JSON (جاوا اسکریپتی) خودشان تبدیل شده اند:

پایتون JSON
dict Object
list Array
tuple Array
str String
int Number
float Number
True true
False false
None null

اگر بخواهیم این موضوع را در یک مثال عملی نشان بدهیم می گوییم:

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# convert into JSON:
y = json.dumps(x)

# the result is a JSON string:
print(y)

خروجی:

{"name": "John", "age": 30, "married": true, "divorced": false, "children": ["Ann","Billy"], "pets": null, "cars": [{"model": "BMW 230", "mpg": 27.5}, {"model": "Ford Edge", "mpg": 24.1}]}

بدین صورت تمامی مقادیر ما تبدیل به معادل JSON می شوند.

قالب بندی خروجی JSON

اگر دقت کرده باشید برای نمایش این رشته از تابع ()json.dumps استفاده کرده ایم. این تابع پارامترهای دیگری دارد که کار مرتب کردن رشته ی JSON را انجام می دهند. همانطور که می بینید خروجی کد بالا خیلی تمیز و قابل خواندن نیست و یک رشته ی پشت سر هم می باشد. یکی از پارامترهای قالب بندی این تابع indent است که کار indentation (فرورفتگی های اول خطوط) را انجام میدهد:

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# use four indents to make it easier to read the result:
print(json.dumps(x, indent=4))

خروجی به شکل زیر خواهد بود:

{
    "name": "John",
    "age": 30,
    "married": true,
    "divorced": false,
    "children": [
        "Ann",
        "Billy"
    ],
    "pets": null,
    "cars": [
        {
            "model": "BMW 230",
            "mpg": 27.5
        },
        {
            "model": "Ford Edge",
            "mpg": 24.1
        }
    ]
}

توجه داشته باشید که من خروجی را مرتب نکرده ام. خروجی به صورت متنی نیز به همین شکل و مرتب شده است:

{
"name": "John",
"age": 30,
"married": true,
"divorced": false,
"children": [
"Ann",
"Billy"
],
"pets": null,
"cars": [
{
"model": "BMW 230",
"mpg": 27.5
},
{
"model": "Ford Edge",
"mpg": 24.1
}
]
}

پارامتر بعدی این تابع separators (جدا کننده ها) است. مقدار پیش فرض آن هم (" :" ," ,") است؛ یعنی با استفاده از علامت , (ویرگول انگلیسی) و یک اسپیس اشیاء را از هم جدا کرده و با استفاده از علامت : و یک اسپیس key ها را از value ها جدا می کند. ما می توانیم این مقدار را به دلخواه خود تغییر دهیم. مثال:

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# use . and a space to separate objects, and a space, a = and a space to separate keys from their values:
print(json.dumps(x, indent=4, separators=(". ", " = ")))

کد بالا می گوید با استفاده از علامت نقطه و یک اسپیس اشیاء را جدا کن و سپس با یک اسپیس و علامت = و یک اسپیس دیگر key ها را از value ها جدا کن. خروجی بدون دستکاری و مرتب سازی به شکل زیر خواهد بود:

{
    "name" = "John".
    "age" = 30.
    "married" = true.
    "divorced" = false.
    "children" = [
        "Ann".
        "Billy"
    ],
    "pets" = null.
    "cars" = [
        {
            "model" = "BMW 230".
            "mpg" = 27.5
        }.
        {
            "model" = "Ford Edge".
            "mpg" = 24.1
        }
    ]
}

آخرین پارامتر نیز sort_keys می باشد که مشخص می کند نتایج باید به ترتیب خاصی (بر اساس حروف الفبای انگلیسی) نمایش داده شوند یا خیر (با استفاده از true یا false). به کد زیر نگاه کنید:

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# sort the result alphabetically by keys:
print(json.dumps(x, indent=4, sort_keys=True))

خروجی این کد به شکل زیر خواهد بود:

{
    "age": 30,
    "cars": [
        {
            "model": "BMW 230",
            "mpg": 27.5
        },
        {
            "model": "Ford Edge",
            "mpg": 24.1
        }
    ],
    "children": [
        "Ann",
        "Billy"
    ],
    "divorced": false,
    "married": true,
    "name": "John",
    "pets": null
}

امیدوارم با قابلیت های فراوان پایتون برای کار با JSON آشنا شده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری از مقدماتی تا پیشرفته با پایتون توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی
04 آبان 1400
مثل همیشه عالی .

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.