GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io — json --- کدگذار و کدگشای JSON
|
JSON |
پایتون |
|---|---|
شیء |
dict |
آرایه |
فهرست |
رشته |
str |
عدد (int) |
int |
عدد (حقیقی) |
float |
true |
True |
false |
False |
null |
None |
همچنین NaN، Infinity و -Infinity را بهعنوان مقادیر float متناظرشان میشناسد، که خارج از مشخصات JSON است.
object_hook تابعی اختیاری است که با نتیجهی کدگشایی هر شیء JSON فراخوانی میشود و مقدار بازگشتی آن بهجای dict دادهشده استفاده میشود. میتوان از آن برای فراهمکردن سریالزدایی سفارشی، برای نمونه برای پشتیبانی از اشارهگذاری کلاس (class hinting) در JSON-RPC، استفاده کرد.
object_pairs_hook یک تابع اختیاری است که با نتیجهی کدگشایی هر شیء JSON بهصورت یک فهرست مرتب از جفتها فراخوانی میشود. مقدار بازگشتی object_pairs_hook بهجای dict استفاده خواهد شد. از این قابلیت میتوان برای پیادهسازی کدگشاهای سفارشی استفاده کرد. اگر object_hook نیز تعریف شده باشد، object_pairs_hook اولویت دارد.
تغییر یافته در نسخهی 3.1: پشتیبانی از object_pairs_hook افزوده شد.
array_hook تابعی اختیاری است که با نتیجهی هر آرایهی JSON رمزگشاییشده به عنوان یک فهرست فراخوانی میشود. مقدار بازگشتی array_hook به جای list استفاده خواهد شد. از این ویژگی میتوان برای پیادهسازی رمزگشاهای سفارشی استفاده کرد.
تغییر یافته در نسخهی 3.15: پشتیبانی از array_hook اضافه شد.
parse_float یک تابع اختیاری است که با رشتهی هر عدد اعشاری JSON که کدگشایی میشود، فراخوانی خواهد شد. بهطور پیشفرض، این معادل float(num_str) است. میتوان از آن برای استفاده از یک نوع داده یا پارسر دیگر برای اعداد اعشاری JSON استفاده کرد (برای مثال decimal.Decimal).
parse_int تابعی اختیاری است که با رشتهی هر عدد صحیح JSON که باید کدگشایی شود، فراخوانی میشود. بهطور پیشفرض، این معادل int(num_str) است. این را میتوان برای استفاده از نوع داده یا پارسر دیگری برای اعداد صحیح JSON (برای مثال float) به کار برد.
parse_constant یک تابع اختیاری است که با یکی از رشتههای زیر فراخوانی میشود: '-Infinity'، 'Infinity'، 'NaN'. میتوان از این برای پرتاب استثنا در صورت مواجهه با اعداد JSON نامعتبر استفاده کرد.
اگر strict نادرست باشد (True پیشفرض است)، آنگاه نویسههای کنترلی در داخل رشتهها مجاز خواهند بود. نویسههای کنترلی در این زمینه، آنهایی هستند که کدهای نویسهشان در بازهی ۰--۳۱ قرار دارند، شامل '\t' (تب)، '\n'، '\r' و '\0'.
اگر دادهای که در حال بازخوانی (deserialize) است، سند JSON معتبری نباشد، استثنای JSONDecodeError پرتاب خواهد شد.
تغییر یافته در نسخهی 3.6: اکنون همهی پارامترها فقط کلیدواژهای هستند.
بازنمایی پایتونی s (یک نمونهی str که شامل یک سند JSON است) را برمیگرداند.
اگر سند JSON دادهشده معتبر نباشد، JSONDecodeError پرتاب میشود.
یک سند JSON را از s (یک str که با یک سند JSON آغاز میشود) کدگشایی کنید و یک تاپل دوتایی شامل بازنمایی پایتونی و اندیسی در s که سند در آن به پایان رسیده است را برگردانید.
این را میتوان برای کدگشایی یک سند JSON از رشتهای که ممکن است در انتهای خود دادههای اضافی داشته باشد به کار برد.
کدگذار JSON توسعهپذیر برای ساختارهای داده پایتون.
بهطور پیشفرض از اشیاء و انواع زیر پشتیبانی میکند:
پایتون |
JSON |
|---|---|
dict, frozendict |
شیء |
فهرست، تاپل |
آرایه |
str |
رشته |
int، float، Enumهای مشتقشده از int و float |
عدد |
True |
true |
False |
false |
None |
null |
تغییر یافته در نسخهی 3.4: پشتیبانی از کلاسهای Enum مشتقشده از int و float افزوده شد.
تغییر یافته در نسخهی 3.15: پشتیبانی از frozendict اضافه شد.
برای گسترش آن جهت شناسایی اشیاء دیگر، یک زیرکلاس بسازید و متد default() را با متد دیگری پیادهسازی کنید که در صورت امکان یک شیء قابل سریالسازی برای o برمیگرداند؛ در غیر این صورت باید پیادهسازی ابرکلاس را فراخوانی کند (تا TypeError پرتاب شود).
اگر skipkeys نادرست (پیشفرض) باشد، هنگام تلاش برای کدگذاری کلیدهایی که str، int، float، bool یا None نیستند، یک TypeError پرتاب میشود. اگر skipkeys درست باشد، چنین آیتمهایی بهسادگی نادیده گرفته میشوند.
اگر ensure_ascii برابر true باشد (پیشفرض)، تضمین میشود که در خروجی تمام نویسههای ورودی غیر ASCII و غیرقابلچاپ خنثی شوند. اگر ensure_ascii برابر false باشد، همه نویسهها همانطور که هستند در خروجی قرار میگیرند، به جز نویسههایی که باید خنثی شوند: علامت نقلقول، اسلش معکوس (reverse solidus)، و نویسههای کنترلی U+0000 تا U+001F.
اگر check_circular برابر true باشد (حالت پیشفرض)، فهرستها، دیکشنریها و اشیای کدگذاریشده سفارشی حین کدگذاری از نظر ارجاعهای دوری بررسی میشوند تا از یک بازگشت بیپایان (که باعث پرتاب RecursionError میشود) جلوگیری شود. در غیر این صورت، چنین بررسیای انجام نمیشود.
اگر allow_nan مقدار true داشته باشد (پیشفرض)، آنگاه NaN، Infinity و -Infinity به همان صورت کدگذاری خواهند شد. این رفتار مطابق با مشخصات JSON نیست، اما با بیشتر کدگذارها و کدگشاهای مبتنی بر JavaScript سازگار است. در غیر این صورت، کدگذاری چنین اعداد اعشاریای موجب ValueError خواهد شد.
اگر sort_keys درست باشد (پیشفرض: False)، خروجی دیکشنریها بر اساس کلید مرتب خواهد شد؛ این برای آزمونهای رگرسیون (regression tests) مفید است تا اطمینان حاصل شود که سریالسازیهای JSON را میتوان بهصورت روزمره مقایسه کرد.
اگر indent یک عدد صحیح نامنفی یا رشته باشد، عناصر آرایه و اعضای شیء در JSON با آن سطح تورفتگی زیبانویسی میشوند. سطح تورفتگی ۰، منفی یا "" فقط سطرهای جدید را درج میکند. None (پیشفرض) فشردهترین نمایش را انتخاب میکند. استفاده از یک عدد صحیح مثبت بهعنوان تورفتگی، در هر سطح به همان تعداد فاصله درج میکند. اگر indent یک رشته باشد (مانند "\t")، از آن رشته برای تورفتگی هر سطح استفاده میشود.
تغییر یافته در نسخهی 3.2: پذیرش رشتهها برای indent علاوه بر اعداد صحیح.
اگر مشخص شده باشد، separators باید یک تاپل (item_separator, key_separator) باشد. اگر indent برابر None باشد، مقدار پیشفرض (', ', ': ') و در غیر این صورت (',', ': ') است. برای فشردهترین نمایش JSON، باید (',', ':') را مشخص کنید تا فضای سفید حذف شود.
تغییر یافته در نسخهی 3.4: اگر indent برابر None نباشد، از (',', ': ') بهعنوان پیشفرض استفاده میشود.
اگر مشخص شده باشد، default باید تابعی باشد که برای اشیایی که نمیتوان آنها را به شکل دیگری سریالسازی کرد، فراخوانی میشود. این تابع باید نسخهای از شیء را برگرداند که قابل کدگذاری بهصورت JSON باشد یا TypeError را پرتاب کند. اگر مشخص نشده باشد، TypeError پرتاب میشود.
تغییر یافته در نسخهی 3.6: اکنون همهی پارامترها فقط کلیدواژهای هستند.
این متد را در یک زیرکلاس بهگونهای پیادهسازی کنید که برای o یک شیء قابل سریالسازی برگرداند، یا پیادهسازی پایه را فراخوانی کند (تا TypeError پرتاب شود).
برای مثال، برای پشتیبانی از پیمایشگرهای دلخواه، میتوانید default() را به این شکل پیادهسازی کنید:
def default(self, o): try: iterable = iter(o) except TypeError: pass else: return list(iterable) # Let the base class default method raise the TypeError return super().default(o)
یک نمایش رشتهای JSON از یک ساختار داده پایتون، o را برمیگرداند. برای مثال:
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]}) '{"foo": ["bar", "baz"]}'
شیء دادهشده، o، را کدگذاری میکند و هر بازنمایی رشتهای را بهمحض در دسترس بودن تولید میکند. برای مثال:
for chunk in json.JSONEncoder().iterencode(bigobject): mysocket.write(chunk)
قالب JSON توسط RFC 7159 و ECMA-404 تعیین شده است. این بخش میزان انطباق این ماژول با RFC را با جزئیات شرح میدهد. برای سادگی، زیرکلاسهای JSONEncoder و JSONDecoder و پارامترهایی غیر از آنهایی که بهصراحت ذکر شدهاند، در نظر گرفته نمیشوند.
این ماژول بهصورت سختگیرانه با RFC مطابقت نمیکند و برخی افزونهها را پیادهسازی میکند که در JavaScript معتبر هستند اما در JSON معتبر نیستند. بهویژه:
مقادیر عددی بینهایت و NaN پذیرفته میشوند و در خروجی قرار میگیرند؛
نامهای تکراری در یک شیء پذیرفته میشوند و تنها از مقدار آخرین جفت نام-مقدار استفاده میشود.
از آنجایی که RFC به پارسرهای سازگار با RFC اجازه میدهد متنهای ورودیای را بپذیرند که با RFC سازگار نیستند، سریالزدا (deserializer) این ماژول از نظر فنی در تنظیمات پیشفرض با RFC سازگار است.
RFC الزام میکند که JSON با استفاده از یکی از کدگذاریهای UTF-8، UTF-16 یا UTF-32 بازنمایی شود؛ UTF-8 بهعنوان پیشفرض توصیهشده برای حداکثر تعاملپذیری پیشنهاد میشود.
همانطور که توسط RFC مجاز است، هرچند الزامی نیست، سریالساز این ماژول بهطور پیشفرض ensure_ascii=True را تنظیم میکند، بدین ترتیب خروجی را خنثی میکند تا رشتههای حاصل فقط شامل نویسههای ASCII قابلچاپ باشند.
بهجز پارامتر ensure_ascii، این ماژول بهطور دقیق بر حسب تبدیل میان اشیای پایتون و رشتههای یونیکد تعریف شده است و بنابراین در غیر این صورت بهطور مستقیم به موضوع کدگذاریهای نویسه نمیپردازد.
این RFC افزودن نشانگر ترتیب بایت (BOM) به ابتدای یک متن JSON را ممنوع میکند و سریالساز این ماژول، یک BOM به خروجی خود اضافه نمیکند. این RFC به سریالزداهای JSON اجازه میدهد، اما آنها را ملزم نمیکند که یک BOM اولیه در ورودی خود را نادیده بگیرند. سریالزدای این ماژول، هنگام وجود یک BOM اولیه، یک ValueError پرتاب میکند.
RFC بهصراحت رشتههای JSON حاوی دنبالههای بایتی را که با نویسههای معتبر Unicode متناظر نیستند (مثلاً جانشینهای جفتنشده UTF-16) ممنوع نمیکند، اما تذکر میدهد که آنها ممکن است باعث مشکلات تعاملپذیری شوند. بهطور پیشفرض، این ماژول نقاط کد چنین دنبالههایی را میپذیرد و (در صورت وجود در str اصلی) خروجی میدهد.
این RFC اجازهی نمایش مقادیر عددی بینهایت یا NaN را نمیدهد. با وجود این، بهطور پیشفرض، این ماژول Infinity، -Infinity و NaN را میپذیرد و خروجی میدهد، گویی که مقادیر لفظی عددی معتبر JSON باشند:
>>> # Neither of these calls raises an exception, but the results are not valid JSON >>> json.dumps(float('-inf')) '-Infinity' >>> json.dumps(float('nan')) 'NaN' >>> # Same when deserializing >>> json.loads('-Infinity') -inf >>> json.loads('NaN') nan
در سریالساز (serializer)، میتوان از پارامتر allow_nan برای تغییر این رفتار استفاده کرد. در سریالزدا (deserializer)، میتوان از پارامتر parse_constant برای تغییر این رفتار استفاده کرد.
RFC مشخص میکند که نامهای درون یک شیء JSON باید یکتا باشند، اما الزام نمیکند که با نامهای تکراری در اشیای JSON چگونه برخورد شود. بهطور پیشفرض، این ماژول استثنایی پرتاب نمیکند؛ در عوض، برای یک نام مشخص، همهی جفتهای نام-مقدار بهجز آخرین جفت را نادیده میگیرد:
>>> weird_json = '{"x": 1, "x": 2, "x": 3}' >>> json.loads(weird_json) {'x': 3}
میتوان از پارامتر object_pairs_hook برای تغییر این رفتار استفاده کرد.
نسخه قدیمی JSON که در RFC 4627 منسوخ مشخص شده بود، الزام میکرد که مقدار سطح بالای یک متن JSON باید یا یک شیء JSON یا یک آرایه (در پایتون dict یا list) باشد و نمیتوانست یک مقدار JSON از نوع null، بولی، عدد یا رشته باشد. RFC 7159 آن محدودیت را حذف کرد و این ماژول آن محدودیت را پیادهسازی نمیکند و هرگز نه در سریالساز (serializer) خود و نه در سریالزدا (deserializer) خود پیادهسازی نکرده است.
با این حال، برای حداکثر تعاملپذیری، ممکن است بخواهید خودتان داوطلبانه این محدودیت را رعایت کنید.
برخی پیادهسازیهای JSON deserializer ممکن است محدودیتهایی برای موارد زیر تعیین کنند:
اندازهی متنهای JSON پذیرفتهشده
حداکثر سطح تودرتویی اشیاء و آرایههای JSON
بازه و دقت اعداد JSON
محتوا و حداکثر طول رشتههای JSON
این ماژول هیچگونه محدودیتی از این دست، فراتر از محدودیتهای خود انواع داده مرتبط پایتون یا خود مفسر پایتون، اعمال نمیکند.
هنگام سریالسازی به JSON، از هرگونه محدودیت از این دست در برنامههایی که ممکن است JSON شما را مصرف کنند آگاه باشید. بهویژه، رایج است که اعداد JSON به اعداد با دقت مضاعف IEEE 754 سریالزدایی شوند و بنابراین مشمول محدودیتهای بازه و دقت آن بازنمایی باشند. این موضوع بهویژه هنگام سریالسازی مقادیر int پایتون با بزرگی بسیار زیاد، یا هنگام سریالسازی نمونههایی از انواع عددی «نامتعارف» مانند decimal.Decimal اهمیت دارد.
کد منبع: Lib/json/tool.py
ماژول json را میتوان بهعنوان یک اسکریپت از طریق python -m json برای اعتبارسنجی و زیبانویسی اشیای JSON فراخوانی کرد. زیرماژول json.tool این رابط را پیادهسازی میکند.
اگر آرگومانهای اختیاری infile و outfile تعیین نشده باشند، بهترتیب از sys.stdin و sys.stdout استفاده خواهد شد:
$ echo '{"json": "obj"}' | python -m json { "json": "obj" } $ echo '{1.2:3.4}' | python -m json Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
تغییر یافته در نسخهی 3.5: خروجی اکنون به همان ترتیب ورودی است. برای مرتبسازی خروجی دیکشنریها بهترتیب الفبایی کلیدها، از گزینهی --sort-keys استفاده کنید.
تغییر یافته در نسخهی 3.14: ماژول json اکنون میتواند مستقیماً بهصورت python -m json اجرا شود. برای سازگاری با نسخههای پیشین، فراخوانی رابط خط فرمان بهصورت python -m json.tool همچنان پشتیبانی میشود.
پرونده JSON برای اعتبارسنجی یا زیبانویسی:
$ python -m json mp_films.json [ { "title": "And Now for Something Completely Different", "year": 1971 }, { "title": "Monty Python and the Holy Grail", "year": 1975 } ]
اگر infile مشخص نشده باشد، از sys.stdin خوانده میشود.
خروجی infile را در outfile دادهشده بنویسید. در غیر این صورت، آن را در sys.stdout بنویسید.
خروجی دیکشنریها را بر اساس کلید بهصورت الفبایی مرتب کنید.
اضافه شده در نسخهی 3.5.
غیرفعال کردن خنثیکردن نویسههای غیر ASCII، برای اطلاعات بیشتر json.dumps() را ببینید.
اضافه شده در نسخهی 3.9.
هر خط ورودی را بهعنوان یک شیء JSON جداگانه تجزیه کنید.
اضافه شده در نسخهی 3.8.
گزینههای متقابلاً انحصاری برای کنترل فضای سفید.
اضافه شده در نسخهی 3.9.
نمایش پیام راهنما.
پانویسها