تعد الحزمة strong-json مكتبة خفيفة الوزن ولكنها قادرة على العمل مع ملفات وكائنات JSON في Python.
يمكنك تثبيت هذه الحزمة مباشرة من PyPI:
pip install robust-json
هذه المكتبة مدعومة على python 3.x فقط.
إذا كنت ترغب في تحسين هذا المشروع، ناقش فكرتك أولاً عن طريق فتح عدد جديد. بعد ذلك، قم بتقسيم هذا المستودع وتنفيذ هذه الميزة الرائعة أو إصلاح هذا الخطأ المزعج. ثم قم بإنشاء علاقات عامة جديدة وانتظر الموافقة.
ملحوظة: يرجى قراءة ملفمساهمة.md أولاً. هناك يمكنك العثور على قواعد السلوك ومعلومات مفيدة فيما يتعلق بعملية المساهمة.
تتضمن هذه المكتبة 4 وحدات:
توفر هذه الوحدة طرقًا متنوعة للعمل مع ملفات JSON من خلال فئة JsonFileParser . يقوم تلقائيًا بتوزيع وتحميل JSON صالح من ملف محدد ويتحقق أيضًا مما إذا كان الملف جاهزًا للمعالجة. للوصول إليه، ما عليك سوى استيراد JsonFileParser من وحدة الملف:
from robust_json.file import JsonFileParser
وتهيئته:
op = JsonFileParser(path_to_json_file)
ملاحظة: يدعم JsonFileParser الآن الحفظ التلقائي. إذا تم تمكينها، ستقوم الوحدة بحفظ الكائن النشط بعد كل تغيير يتم إجراؤه عليه وكتابته في الملف المحدد.
لتمكين الحفظ التلقائي، ما عليك سوى تهيئة هذه الوحدة مع ضبط معلمة autosave
على True
:
op = JsonFileParser(path_to_json_file, autosave=True)
ملاحظة: يمكنك أيضًا تحديد ملف للحفظ التلقائي. فقط قم بتمرير معلمة autosave_path
مع المسار إلى ملفك أثناء التهيئة، مثل هذا:
op = JsonFileParser(path*to_json_file, autosave=True, autosave_path=path_to_autosave_file)
إذا كان الملف غير موجود، ستقوم الوحدة بإنشاء واحد. إذا كان الملف موجودًا، فسيتم اقتطاعه وتعبئته بكائن نشط متسلسل.
أثناء التهيئة قد يظهر استثناء JSONFileError . هذا يعني أن المحلل اللغوي لم يتمكن من معالجة محتويات الملف المحدد أو أن الملف له امتداد غير مدعوم. أثناء هذه المرحلة أيضًا، قد يظهر خطأ FileNotFoundError مما يشير إلى أن الملف المحدد غير موجود. سيتم ظهور خطأ IncorrectFunctionParameterTypeError إذا كانت واحدة أو أكثر من المعلمات تحتوي على أنواع غير صحيحة.
ملكيات :
JsonFileParser.file_formats تسرد هذه الخاصية كافة امتدادات الملفات التي تدعمها هذه الوحدة في شكل مصفوفة. في الوقت الحالي، يتم دعم ملفات .json و .txt فقط. يتم استخدام هذا أثناء تهيئة الفصل لتحديد ما إذا كان من الممكن معالجة الملف.
JsonFileParser.path تقوم هذه الخاصية بإرجاع مسار الملف المصدر
JsonFileParser.active_json تقوم هذه الخاصية بإرجاع كائن JSON مع كافة التغييرات الأخيرة.
JsonFileParser.backup تقوم هذه الخاصية بإرجاع كائن JSON الأولي، متجاهلة كافة التغييرات الأخيرة. قد تكون هاتان الخاصيتان الأخيرتان مربكتين، لذا إليك مثال ( ملاحظة: راجع قسم الوثائق المقابلة لوظيفة JsonFileParser.append() ):
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') #Class initialization
# Contents of 'test1.json' file: {'test_key': 'test_value'}
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonFileParser.backup property is equal to initial contents of 'test1.json' file.
# This is useful when there is a need to discard all changes to JSON object.
طُرق :
JsonFileParser.get_json_from_file() تسترد هذه الطريقة جميع ملفات JSON من الملف وتعيدها كقاموس Python. يتم استدعاؤه تلقائيًا عند معالجة الملف المحدد لأول مرة.
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') # JsonFileParser.get_json_from_file() function is called here
JsonFileParser.get_key_value(json_path: str) تصل هذه الطريقة إلى قيمة من مفتاح محدد: زوج القيمة في كائن JSON وتعيده. تحدد المعلمة json_path:str مسارًا إلى زوج المفتاح: القيمة (على سبيل المثال، field0.field1.[...].fieldn). مثال:
from robust_json.file import JsonFileParser
op = JsonFileParser('test2.json')
# Contents of 'test2.json' file: {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
ستقوم هذه الوظيفة برفع الخطأ IncorrectFunctionParameterTypeError إذا كانت المعلمة الخاصة بها تحتوي على نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع JSONPathError إذا كان مسار JSON المحدد غير صالح (غير موجود أو لا يمكن الوصول إليه).
JsonFileParser.append(json_path: str, append_value: Any, append_at_end: bool = False) تقوم هذه الطريقة بإلحاق قيمة بكائن JSON الموجود وإرجاع قاموس Python بمحتويات محدثة. تحدد المعلمة json_path:str المسار الذي ستتم إضافة قيمة جديدة إليه. لإلحاق قيمة بجذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$'. append_value: تحدد أي معلمة القيمة التي سيتم إلحاقها. يتحكم append_at_end:bool في سلوك هذه الوظيفة فيما يتعلق بمصفوفات JSON للكائنات (هياكل مثل هذه: [{}، {}، {}، ...]) والمصفوفات العامة (هياكل مثل هذه: [a، b، c، . ..]). ليس له أي تأثير على الهياكل الأخرى. إذا تم ضبطها على False، فستحاول الدالة إضافة قيمة معينة إلى كل كائن في المصفوفة. إذا تم ضبطها على True، فستحاول الدالة إلحاق قيمة معينة في نهاية المصفوفة. (انظر الأمثلة أدناه). ستعيد هذه الوظيفة قاموس Python مع JSON المحدث.
ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeEroor إذا كانت المعلمة (-s) الخاصة بها تحتوي على نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع استثناء ValueError إذا كانت "قيمة الإلحاق" فارغة (تساوي سلسلة فارغة، أو صفيفًا فارغًا، أو قاموسًا فارغًا، وما إلى ذلك). ستقوم هذه الوظيفة برفع _JSONPathError إذا كان المسار المقدم غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
إضافة مفتاح بسيط: زوج القيمة إلى جذر الكائن
from robust_json.file import JsonFileParser
op = JsonFileParser('test3.json')
# Contents of 'test3.json' file: {'test_key': 'test_value'}
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
إضافة كائن جديد إلى مجموعة الكائنات
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values have overwritten the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonFileParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
إضافة زوج المفتاح: القيمة إلى كل كائن في المصفوفة
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
إضافة عنصر جديد إلى مجموعة من العناصر:
from robust_json.file import JsonFileParser
op = JsonFileParser('test4.json')
# Contents of 'test4.json' file: {'colors': ['cyan', 'magenta']}
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened.
# That's because 'append_at_end' parameter is set to False.
# Function tried to append new string to each string and failed.
# To fix this, we need to set 'append_at_end' parameter to True.
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonFileParser.update_value (json_path: str، key_or_index: Union[str، int]، new_value: Any، الصارم_mode: bool = False)
ستقوم هذه الوظيفة بتحديث القيمة في زوج المفتاح: القيمة وإرجاع قاموس Python بمحتويات محدثة. تحدد المعلمة json_path:str مسارًا إلى المفتاح: زوج القيمة/الصفيف/إلخ. الوالدين الذي يحتاج إلى تحديث. (لتحديث القيمة في جذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$') بينما تحدد المعلمة key_or_index:Union[str, int] المفتاح (إذا كان كائنًا) أو فهرس المصفوفة (إذا كان مصفوفة). هذا يعني أنه إذا كنا بحاجة إلى تحديث المفتاح بالمسار "field0.field1.upd key"، فإن _json_path سيكون مساويًا لـ "field0.field1" وستكون المعلمة key_or_index مساوية لـ "upd key". _ملاحظة: إذا كنت تستخدم فهرس مصفوفة بينما تشير المعلمة "json_path" إلى كائن JSON، أو إذا كنت تستخدم اسم خاصية بينما يشير "json_path" إلى مصفوفة JSON، فسيتم ظهور استثناء (انظر الأمثلة أدناه). تحدد new_value:any القيمة التي ستحل محل القيمة القديمة، كما يقوم strict_mode:bool بتمكين الوضع الصارم. بشكل افتراضي، يتم إيقاف تشغيل هذا الوضع. إذا تم تشغيل هذه الطريقة، فستضمن أن القيمة الجديدة لها نفس نوع القيمة القديمة (إذا كانت القيمة القديمة عبارة عن سلسلة، فيجب أن تكون القيمة الجديدة أيضًا سلسلة، وما إلى ذلك). إذا كانت الأنواع غير متطابقة، فسيتم ظهور استثناء.
ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeError لأن المعلمة (-s) الخاصة بها تحتوي على (-ve) نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع JSONStrictModeError في حالة الأنواع غير المتطابقة إذا تم تمكين Strict Mode واستثناء JSONPathError إذا كان مسار JSON غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
تحديث المفتاح: زوج القيمة في جذر الكائن:
from robust_json.file import JsonFileParser
op = JsonFileParser('test5.json')
# Contents of 'test5.json' file: {'app_name': 'HomeCare', 'version', '1.0.0'}
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
تحديث العنصر في المصفوفة:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use
# 'get_item_index()' function from 'robust_json.ext' module to get it.
# (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
تحديث القيمة باستخدام الوضع الصارم:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'app_id': 1077}
op.update_value('$', 'app_id', 'this is a string', True)
# A 'StrictModeError' exception was raised.
# This happened because new value has a different type.
# Let's try again, but with integer.
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonFileParser.delete(json_path: str, key_or_index: Union[str, int]) ستقوم هذه الوظيفة بحذف عنصر من JSON وإرجاع قاموس Python بمحتويات محدثة. تحدد المعلمة json_path:str مسارًا إلى المفتاح: زوج القيمة/الصفيف/إلخ. الوالدين الذي يجب حذفه. (لحذف القيمة في جذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$') بينما تحدد المعلمة key_or_index:Union[str, int] المفتاح (إذا كان كائنًا) أو فهرس المصفوفة (إذا كان مصفوفة). هذا يعني أنه إذا كنا بحاجة إلى حذف المفتاح بالمسار "field0.field1.del key"، فإن _json_path سيكون مساويًا لـ "field0.field1" وستكون المعلمة key_or_index مساوية لـ "del key". _ملاحظة: إذا كنت تستخدم فهرس مصفوفة بينما تشير المعلمة "json_path" إلى كائن JSON، أو إذا كنت تستخدم اسم خاصية بينما يشير "json_path" إلى مصفوفة JSON، فسيتم ظهور استثناء (انظر الأمثلة أدناه). ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeError لأن المعلمة (-s) الخاصة بها تحتوي على (-ve) نوع غير صحيح. ستثير هذه الوظيفة أيضًا استثناء JSONPathError إذا كان مسار JSON غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
حذف المفتاح: زوج القيمة في جذر الكائن:
from robust_json.file import JsonFileParser
op = JsonFileParser('test7.json')
# Contents of 'test5.json' file: {'test_key': 'test_val', 'del_key': 'del_val'}
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
حذف عنصر في مصفوفة:
from robust_json.file import JsonFileParser
op = JsonFileParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test9.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonFileParser.minify() ستقوم هذه الوظيفة بإزالة جميع المسافات البادئة في ملف JSON. في الأساس سوف يقوم بضغط كل JSON في سطر واحد.
هذه الدالة لا ترجع أي قيمة.
JsonFileParser.prettify(indent: int = 4) ستضيف هذه الوظيفة مسافات بادئة إلى JSON في الملف المصدر لتحسين إمكانية قراءته. المسافة البادئة: تحدد المعلمة عدد المسافات. افتراضيًا، تساوي 4. هذه الوظيفة معاكسة تمامًا لـ JsonFileParser.minify()
هذه الدالة لا ترجع أي قيمة.
ستقوم هذه الوظيفة برفع الخطأ IncorrectFunctionParameterTypeError إذا كانت المعلمة الخاصة بها تحتوي على نوع غير صحيح.
JsonFileParser.reset(discard_active_object: bool = False) ستعمل هذه الوظيفة على إعادة تعيين كائن JSON النشط، وإزالة أي تغييرات تم إجراؤها عليه. Disk_active_object: تتحكم المعلمة bool في سلوك هذه الوظيفة فيما يتعلق بكائن JSON النشط (خاصية JsonFileParser.active_json). إذا تم ضبطها على False، فسوف تقوم هذه الطريقة ببساطة بإرجاع كائن أولي وتحتفظ بجميع التغييرات على actove JSON. إذا تم ضبطها على True، فستستمر هذه الوظيفة في إرجاع الكائن الأولي، ولكنها ستعيد أيضًا تعيين الكائن النشط، وستختفي جميع التغييرات إلى الأبد.
ستقوم هذه الوظيفة برفع الخطأ IncorrectFunctionParameterTypeError إذا كانت المعلمة الخاصة بها تحتوي على نوع غير صحيح.
أمثلة:
الحصول على كائن أولي وتخزينه في متغير:
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use.
الحصول على كائن أولي وإعادة تعيين كائن نشط:
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True.
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonFileParser.save_to_file (المسار: str = لا شيء، prettify: bool = True، create_file: bool = False) ستحفظ هذه الوظيفة كائن JSON النشط في الملف. المسار: تحدد المعلمة str المسار إلى الملف. إذا تركت فارغة، سيتم حفظ الكائن النشط في الملف المصدر. prettify:bool تمكن المعلمة من المسافات البادئة. افتراضيًا، يتم تعيينه على True. إذا تم التعيين على False، فسيتم ضغط JSON في سطر واحد. تتيح المعلمة create_file:bool إمكانية إنشاء الملف. إذا تم ضبطها على True، فستقوم هذه الوظيفة بإنشاء ملف جديد وحفظ الكائن النشط هناك، ولكن بشكل واضح إذا كانت معلمة المسار تشير إلى ملف غير موجود. ملاحظة: إذا تم تعيين create_file على True فإن المسار يشير إلى ملف موجود، وسيتم ظهور استثناء.
ستثير هذه الوظيفة خطأ JSONFileError إذا كان الملف النهائي لا يدعم JSON (له امتداد غير مدعوم). ستثير هذه الوظيفة خطأ FileExistsError إذا تم تعيين create_file على True وكان الملف موجودًا بالفعل ضمن المسار المحدد. ستثير هذه الوظيفة خطأ FileNotFoundError إذا تم تعيين create_file على False ولا يمكن تحديد موقع الملف ضمن المسار المحدد. ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
حفظ الكائن النشط في الملف المصدر:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file()
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling 'save_to_file' method without any arguments makes it
# overwrite an object in source file ('data.json' in this case)
# with the value of JsonFileParser.active_json property.
حفظ الكائن النشط في ملف مختلف (موجود):
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonFileParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
حفظ الكائن النشط في ملف مختلف (غير موجود):
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonFileParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
توفر هذه الوحدة أساليب مختلفة للعمل مع كائن JSON مباشرة من خلال فئة JsonObjectParser . تم تصميم هذه الفئة خصيصًا للعمل مع JSON المستلمة من استدعاءات واجهة برمجة التطبيقات (API) أو لاستخدامها في واجهات برمجة التطبيقات (APIs). للوصول إليه، ما عليك سوى استيراد JsonObjectParser من وحدة الملف:
from robust_json.object import JsonObjectParser
وتهيئته:
op = JsonObjectParser(json_obj)
ملاحظة: يدعم JsonObjectParser الآن الحفظ التلقائي. إذا تم تمكينها، ستقوم الوحدة بحفظ الكائن النشط بعد كل تغيير يتم إجراؤه عليه وكتابته في الملف المحدد.
لتمكين الحفظ التلقائي، ما عليك سوى تهيئة هذه الوحدة مع ضبط معلمة autosave
على True
:
op = JsonObjectParser(json_object, autosave=True)
ملاحظة: يمكنك أيضًا تحديد ملف للحفظ التلقائي. ما عليك سوى تمرير معلمة autosave_path
مع المسار إلى ملفك أثناء التهيئة، مثل هذا:
op = JsonObjectParser(json_object, autosave=True, autosave_path=path_to_autosave_file)
إذا كان الملف غير موجود، ستقوم الوحدة بإنشاء واحد. إذا كان الملف موجودًا، فسيتم اقتطاعه وتعبئته بكائن نشط متسلسل.
أثناء التهيئة، قد يظهر استثناء IncorrectFunctionParameterTypeError . هذا يعني أن المعلمة json لها نوع غير صحيح.
ملكيات :
JsonObjectParser.active_json تقوم هذه الخاصية بإرجاع كائن JSON مع كافة التغييرات الأخيرة.
JsonObjectParser.backup تقوم هذه الخاصية بإرجاع كائن JSON الأولي، متجاهلة كافة التغييرات الأخيرة. قد تكون هاتان الخاصيتان الأخيرتان مربكتين، لذا إليك مثال ( ملاحظة: راجع قسم الوثائق المقابلة لوظيفة JsonObjectParser.append() ):
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj) #Class initialization
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonObjectParser.backup property is equal to initial object.
# This is useful when there is a need to discard all changes to JSON object.
طُرق :
JsonObjectParser.get_key_value(json_path: str) تصل هذه الطريقة إلى قيمة من زوج مفتاح محدد: قيمة في كائن JSON وتعيدها. تحدد المعلمة json_path:str مسارًا إلى زوج المفتاح: القيمة (على سبيل المثال، field0.field1.[...].fieldn). مثال:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
op = JsonObjectParser(obj)
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
ستثير هذه الوظيفة خطأ IncorrectFunctionParameterTypeError، لأن المعلمة الخاصة بها تحتوي على نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع JSONPathError إذا كان مسار JSON المحدد غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
JsonObjectParser.append(json_path: str, append_value: Any, append_at_end: bool = False) تقوم هذه الطريقة بإلحاق قيمة بكائن JSON الموجود وإرجاع قاموس Python بمحتويات محدثة. تحدد المعلمة json_path:str المسار الذي ستتم إضافة قيمة جديدة إليه. لإلحاق قيمة بجذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$'. append_value: تحدد أي معلمة القيمة التي سيتم إلحاقها. يتحكم append_at_end:bool في سلوك هذه الوظيفة فيما يتعلق بمصفوفات JSON للكائنات (هياكل مثل هذه: [{}، {}، {}، ...]) والمصفوفات العامة (هياكل مثل هذه: [a، b، c، . ..]). ليس له أي تأثير على الهياكل الأخرى. إذا تم ضبطها على خطأ، فستحاول الدالة إضافة قيمة معينة في كل كائن في المصفوفة. إذا تم ضبطها على True، فستحاول الدالة إلحاق قيمة معينة في نهاية المصفوفة. (انظر الأمثلة أدناه). ستعيد هذه الوظيفة قاموس Python مع JSON المحدث.
ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeEroor إذا كانت المعلمة (-s) الخاصة بها تحتوي على نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع استثناء ValueError إذا كانت "قيمة الإلحاق" فارغة (سلسلة فارغة، صفيف فارغ، قاموس فارغ). ستقوم هذه الوظيفة برفع _JSONPathError إذا كان المسار المقدم غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
إضافة مفتاح بسيط: زوج القيمة إلى جذر الكائن
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj)
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
إضافة كائن جديد إلى مجموعة الكائنات
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values overwrote the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonObjectParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
إضافة زوج المفتاح: القيمة إلى كل كائن في المصفوفة
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
إضافة عنصر جديد إلى مجموعة من العناصر:
from robust_json.object import JsonObjectParser
obj = {'colors': ['cyan', 'magenta']}
op = JsonObjectParser(obj)
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened
# That's because 'append_at_end' parameter is set to False
# Function tried to append new string to each string and failed
# To fix this, we need to set 'append_at_end' parameter to True
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonObjectParser.update_value(json_path: str, key_or_index: Union[str, int], new_value: Any, الصارم_mode: bool = False)
ستقوم هذه الوظيفة بتحديث القيمة في زوج المفتاح: القيمة وإرجاع قاموس بايثون بمحتويات محدثة. تحدد المعلمة json_path:str مسارًا إلى المفتاح: زوج القيمة/الصفيف/إلخ. الوالدين الذي يحتاج إلى تحديث. (لتحديث القيمة في جذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$') بينما تحدد المعلمة key_or_index:Union[str, int] المفتاح (إذا كان كائنًا) أو فهرس المصفوفة (إذا كان مصفوفة). هذا يعني أنه إذا كنا بحاجة إلى تحديث المفتاح بالمسار "field0.field1.upd key"، فإن _json_path سيكون مساويًا لـ "field0.field1" وستكون المعلمة key_or_index مساوية لـ "upd key". _ملاحظة: إذا كنت تستخدم فهرس مصفوفة بينما تشير المعلمة "json_path" إلى كائن JSON، أو إذا كنت تستخدم اسم خاصية بينما يشير "json_path" إلى مصفوفة JSON، فسيتم ظهور استثناء (انظر الأمثلة أدناه). تحدد new_value:any القيمة التي ستحل محل القيمة القديمة، كما يقوم strict_mode:bool بتمكين الوضع Strict Mode. بشكل افتراضي، يتم إيقاف تشغيل هذا الوضع. إذا تم تشغيل هذه الطريقة، فستضمن أن القيمة الجديدة لها نفس نوع القيمة القديمة (إذا كانت القيمة القديمة عبارة عن سلسلة، فيجب أن تكون القيمة الجديدة أيضًا سلسلة، وما إلى ذلك). إذا كانت الأنواع غير متطابقة، فسيتم ظهور استثناء.
ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeError لأن المعلمة (-s) الخاصة بها تحتوي على (-ve) نوع غير صحيح. ستقوم هذه الوظيفة أيضًا برفع JSONStrictModeError في حالة الأنواع غير المتطابقة إذا تم تمكين Strict Mode واستثناء JSONPathError إذا كان مسار JSON غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
تحديث المفتاح: زوج القيمة في جذر الكائن:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'version', '1.0.0'})
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
تحديث العنصر في المصفوفة:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
تحديث القيمة باستخدام الوضع الصارم:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'app_id': 1077})
op.update_value('$', 'app_id', 'this is a string', True)
# An 'StrictModeError' was raised
# This happened because new value has a different type
# Let's try again, but with integer
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonObjectParser.delete(json_path: str, key_or_index: Union[str, int]) ستقوم هذه الوظيفة بحذف عنصر من JSON وإرجاع قاموس Python بمحتويات محدثة. تحدد المعلمة json_path:str مسارًا إلى المفتاح: زوج القيمة/الصفيف/إلخ. الوالدين الذي يجب حذفه. (لحذف القيمة في جذر كائن JSON، يجب أن يكون json_path مساويًا لـ '$') بينما تحدد المعلمة key_or_index:Union[str, int] المفتاح (إذا كان كائنًا) أو فهرس المصفوفة (إذا كان مصفوفة). هذا يعني أنه إذا كنا بحاجة إلى حذف المفتاح بالمسار "field0.field1.del key"، فإن _json_path سيكون مساويًا لـ "field0.field1" وستكون المعلمة key_or_index مساوية لـ "del key". _ملاحظة: إذا كنت تستخدم فهرس مصفوفة بينما تشير المعلمة "json_path" إلى كائن JSON، أو إذا كنت تستخدم اسم خاصية بينما يشير "json_path" إلى مصفوفة JSON، فسيتم ظهور استثناء (انظر الأمثلة أدناه). ستثير هذه الوظيفة استثناء IncorrectFunctionParameterTypeError لأن المعلمة (-s) الخاصة بها تحتوي على (-ve) نوع غير صحيح. ستثير هذه الوظيفة أيضًا استثناء JSONPathError إذا كان مسار JSON غير صالح (غير موجود أو لا يمكن الوصول إليه). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
حذف المفتاح: زوج القيمة في جذر الكائن:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_val', 'del_key': 'del_val'}
op = JsonObjectParser(obj)
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
حذف عنصر في مصفوفة:
from robust_json.object import JsonObjectParser
op = JsonObjectParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
obj = {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op = JsonObjectParser(obj)
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonObjectParser.reset(discard_active_object: bool = False) ستقوم هذه الوظيفة بإعادة تعيين كائن JSON النشط، وإزالة أي تغييرات تم إجراؤها عليه. Disk_active_object: تتحكم المعلمة bool في سلوك هذه الوظيفة فيما يتعلق بكائن JSON النشط (خاصية JsonObjectParser.active_json). إذا تم ضبطها على False، فسوف تقوم هذه الطريقة ببساطة بإرجاع كائن أولي وتحتفظ بجميع التغييرات على actove JSON. إذا تم ضبطها على True، فستستمر هذه الوظيفة في إرجاع الكائن الأولي، ولكنها ستعيد أيضًا تعيين الكائن النشط، وستختفي جميع التغييرات إلى الأبد.
ستقوم هذه الوظيفة برفع الخطأ IncorrectFunctionParameterTypeError إذا كانت المعلمة الخاصة بها تحتوي على نوع غير صحيح. ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
الحصول على كائن أولي وتخزينه في متغير:
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use
الحصول على كائن أولي وإعادة تعيين كائن نشط:
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonObjectParser.save_to_file(path: str, prettify: bool = True, create_file: bool = False) ستحفظ هذه الوظيفة كائن JSON النشط في الملف. المسار: تحدد المعلمة str المسار إلى الملف. prettify:bool تمكن المعلمة من المسافات البادئة. افتراضيًا، يتم تعيينه على True. إذا تم التعيين على False، فسيتم ضغط JSON في سطر واحد. تتيح المعلمة create_file:bool إمكانية إنشاء الملف. إذا تم ضبطها على True، فستقوم هذه الوظيفة بإنشاء ملف جديد وحفظ الكائن النشط هناك، ولكن بشكل واضح إذا كانت معلمة المسار تشير إلى ملف غير موجود. ملاحظة: إذا تم تعيين create_file على True فإن المسار يشير إلى ملف موجود، وسيتم ظهور استثناء.
ستثير هذه الوظيفة خطأ JSONFileError إذا كان الملف النهائي لا يدعم JSON (له امتداد غير مدعوم). ستثير هذه الوظيفة خطأ FileExistsError إذا تم تعيين heate_file على True وكان الملف موجودًا بالفعل ضمن المسار المحدد. ستثير هذه الوظيفة خطأ FileNotFoundError إذا تم تعيين create_file على False ولا يمكن تحديد موقع الملف ضمن المسار المحدد. ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
أمثلة:
حفظ الكائن النشط في ملف (موجود):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonObjectParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
حفظ الكائن النشط في ملف (غير موجود):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonObjectParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
تحتوي هذه الوحدة على كافة الاستثناءات المخصصة التي يمكن رفعها أثناء تشغيل الحزمة. يوجد إجمالي 5: JSONFileError و JSONPathError و JSONStrictModeError و JSONObjectError و IncorrectFunctionParameterTypeError . إذا كنت بحاجة إلى استيرادها، فيمكن القيام بذلك على النحو التالي:
import robust_json.errors as json_err
filter_json_array(json_array: list, field: string, value: Any) ستقوم هذه الوظيفة بتصفية مجموعة محددة من كائنات JSON وإعادتها. تحدد المعلمة json_array:list القائمة التي تحتاج إلى تصفيتها، ويحدد الحقل:str المفتاح والقيمة : أي تحدد القيمة. تشكل المعلمتان الأخيرتان زوجًا من المفتاح: القيمة والذي يأخذ دور المرشح.
ستعيد هذه الوظيفة قائمة بالمحتوى الذي تمت تصفيته.
ستثير هذه الدالة استثناء IncorrectFunctionParameterTypeError إذا كان واحد أو أكثر من المعلمات الخاصة بها يحتوي على نوع غير صحيح. ستطلق هذه الوظيفة خطأ JSONObjectError إذا لم يكن json_arr مصفوفة من الكائنات ([{}، {}، {}، ...]). ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
مثال: تصفية مجموعة من الكائنات حسب زوج مفتاح:قيمة محدد
from robust_json.ext import filter_json_array
orders = [{"order_id":1648,"country":"USA" },{"order_id":1830,"country":"Liberia"},
{"order_id":6703,"country":"USA"},{"order_id":2995,"country":"Russia"}]
usa_orders = filter_json_array(orders, 'country', 'USA')
print(usa_orders)
# Output: [{"order_id":1648,"country":"USA" }, {"order_id":6703,"country":"USA"}]
get_item_index(item: Any, array: list, Always_array: bool = False) ستبحث هذه الوظيفة عن intem في صفيف معين وترجع فهرسه (-es). البند: أي يحدد العنصر الذي يجب العثور على الفهرس. تحدد المصفوفة: القائمة المصفوفة التي يجب أن يكون هذا العنصر موجودًا فيها، ويتحكم Always_array:bool في نوع الإرجاع لهذه الوظيفة. إذا تم ضبطها على False، فسوف تقوم هذه الدالة بإرجاع مصفوفة إذا كان هناك تطابقات متعددة، ولكنها ستعيد عددًا صحيحًا إذا كان هناك تطابق واحد فقط. إذا تم ضبطها على True، فستُرجع هذه الدالة دائمًا مصفوفة (انظر الأمثلة أدناه).
أمثلة:
from robust_json.ext import get_item_index
arr1 = [1, 2, 3, 4]
index = get_item_index(2, arr1, False)
print(index)
# Output: 1
# Note: we set 'always_array' parameter to False, therefore function returned an integer
arr2 = [5, 9, 10, 45, 555]
index = get_item_index(10, arr2, True)
print(index)
# Output: [2]
# Note: we set 'always_array' parameter to True, therefore function returned an array even if there
# is only one match. This is useful when this array will be iterated later on.
arr3 = [1, 6, 'string', 8, 5, 4, 'string', 0, 22]
index = get_item_index('string', arr3, False)
# Note: even if 'alway_array' parameter set to False, this function will return an array of
# integers because there are multiple matches
print(index)
# Output: [2, 6]
arr4 = [1, 2, 3]
index = get_item_index(6, arr4, False)
# Note: if item is not present in the array and 'always_array' parameter set to False,
# None will be returned.
print(index)
# Output: None
arr5 = [5, 6, 7]
index = get_item_index(10, arr5, True)
# Note: if item is not present in the array and 'always_array' parameter set to True,
# an empty array will be returned.
print(index)
# Output: []
Reverse_array(array: list) ستقوم هذه الوظيفة بعكس المصفوفة وإعادتها.
ستقوم هذه الوظيفة برفع الخطأ IncorrectFunctionParameterTypeError إذا كانت المعلمة الخاصة بها تحتوي على نوع غير صحيح. ستثير هذه الوظيفة أي استثناءات إضافية في حالة حدوثها.
مثال:
from robust_json.ext import reverse_array
arr = ['a', 'b', 'c']
rev_arr = reverse_array(arr)
print(rev_arr)
# Output: ['c', 'b', 'a']