يمكن استخدام هذه الحزمة البسيطة لإصلاح سلسلة JSON غير صالحة. لمعرفة جميع الحالات التي ستعمل فيها هذه الحزمة ، تحقق من اختبار الوحدة.
إذا وجدت هذه المكتبة مفيدة ، فيمكنك مساعدتي من خلال التبرع نحو ميزانية البيرة الشهرية هنا: https://github.com/sponsors/mangiucugna
إذا لم تكن متأكدًا مما إذا كانت هذه المكتبة ستصلح مشكلتك المحددة ، أو ببساطة تريد التحقق من صحة JSON عبر الإنترنت ، يمكنك زيارة الموقع التجريبي على صفحات github: https://mangiucugna.github.io/json_repair/
أو اسمع صوتًا عميقًا يتم توليده بواسطة NotebookLM من Google للحصول على مقدمة إلى الوحدة النمطية
بعض LLMs غير معتادة عندما يتعلق الأمر بإرجاع بيانات JSON المكونة جيدًا ، وأحيانًا يتخطون أقواس وأحيانًا يضيفون بعض الكلمات فيها ، لأن هذا ما تفعله LLM. لحسن الحظ ، فإن الأخطاء التي ترتكبها LLMs بسيطة بما يكفي لتثبيت دون تدمير المحتوى.
لقد بحثت عن حزمة بيثون خفيفة الوزن تمكنت من إصلاح هذه المشكلة بشكل موثوق ولكن لم أتمكن من العثور على أي منها.
لذلك كتبت واحدة
كجزء من وظيفتي ، نستخدم APIs Openai ولاحظنا أنه حتى مع الإخراج المنظم في بعض الأحيان ، فإن النتيجة ليست JSON صالحة تمامًا. لذلك ما زلنا نستخدم هذه المكتبة لتغطية تلك القيم المتطرفة.
تثبيت المكتبة مع PIP
pip install json-repair
ثم يمكنك استخدامه في الكود الخاص بك مثل هذا
from json_repair import repair_json
good_json_string = repair_json(bad_json_string)
# If the string was super broken this will return an empty string
يمكنك استخدام هذه المكتبة لاستبدال json.loads()
تمامًا:
import json_repair
decoded_object = json_repair.loads(json_string)
أو عادل
import json_repair
decoded_object = json_repair.repair_json(json_string, return_objects=True)
يعتمد بعض مستخدمي هذه المكتبة النمط التالي:
obj = {}
try:
obj = json.loads(string)
except json.JSONDecodeError as e:
obj = json_repair.loads(string)
...
هذا أمر مضيء لأن json_repair
سوف يتحقق بالفعل من أجلك إذا كان JSON صالحًا ، إذا كنت لا تزال ترغب في القيام بذلك ، فأضف skip_json_loads=True
للمكالمة كما هو موضح في القسم أدناه.
يوفر إصلاح JSON أيضًا استبدالًا إسقاطًا لـ json.load()
:
import json_repair
try:
file_descriptor = open(fname, 'rb')
except OSError:
...
with file_descriptor:
decoded_object = json_repair.load(file_descriptor)
وطريقة أخرى للقراءة من ملف:
import json_repair
try:
decoded_object = json_repair.from_file(json_file)
except OSError:
...
except IOError:
...
ضع في اعتبارك أن المكتبة لن تلتقط أي استثناء مرتبط بـ IO وأنها ستحتاج إلى إدارتها بواسطتك
عند العمل مع الشخصيات غير اللاتينية (مثل الصينية أو اليابانية أو الكورية) ، تحتاج إلى تمرير ensure_ascii=False
repair_json()
من أجل الحفاظ على الأحرف غير اللاتينية في الإخراج.
إليك مثال باستخدام الأحرف الصينية:
repair_json("{'test_chinese_ascii':'统一码'}")
سوف يعود
{"test_chinese_ascii": "u7edfu4e00u7801"}
بدلاً من ذلك ، تمرير ensure_ascii=False
:
repair_json("{'test_chinese_ascii':'统一码'}", ensure_ascii=False)
سوف يعود
{"test_chinese_ascii": "统一码"}
إذا وجدت هذه المكتبة بطيئة جدًا لأنها تستخدم json.loads()
فيمكنك تخطي ذلك عن طريق تمرير skip_json_loads=True
repair_json
. يحب:
from json_repair import repair_json
good_json_string = repair_json(bad_json_string, skip_json_loads=True)
لقد اخترت عدم استخدام أي مكتبة سريعة JSON لتجنب الحصول على أي تبعية خارجية ، بحيث يمكن لأي شخص استخدامه بغض النظر عن مكدسه.
بعض قواعد الإبهام للاستخدام:
return_objects=True
دائمًا أسرع لأن المحلل اللغوي يرجع كائنًا بالفعل ولا يتسلسل هذا الكائن إلى JSONskip_json_loads
أسرع فقط إذا كنت تعرف 100 ٪ أن السلسلة ليست JSON صالحةr"string with escaping""
قم بتثبيت المكتبة لخط الأوامر مع:
pipx install json-repair
لمعرفة جميع الخيارات المتاحة:
$ json_repair -h
usage: json_repair [-h] [-i] [-o TARGET] [--ensure_ascii] [--indent INDENT] filename
Repair and parse JSON files.
positional arguments:
filename The JSON file to repair
options:
-h, --help show this help message and exit
-i, --inline Replace the file inline instead of returning the output to stdout
-o TARGET, --output TARGET
If specified, the output will be written to TARGET filename instead of stdout
--ensure_ascii Pass ensure_ascii=True to json.dumps()
--indent INDENT Number of spaces for indentation (Default 2)
يرجى تثبيت هذه المكتبة فقط على الإصدار الرئيسي!
نحن نستخدم TDD والإصدار الدلالي الصارم ، سيكون هناك تحديثات متكررة ولا توجد تغييرات في الإصدارات البسيطة والتصحيح. للتأكد من أنك تثبت فقط الإصدار الرئيسي من هذه المكتبة في requirements.txt
الخاصة بك. txt ، حدد اسم الحزمة متبوعًا بالإصدار الرئيسي والبطاقة البرية للإصدارات الصغرى والتصحيح. على سبيل المثال:
json_repair==0.*
في هذا المثال ، سيكون أي إصدار يبدأ بـ 0.
سيكون مقبولًا ، مما يسمح بتحديثات على إصدارات Minor و Patch.
إذا كنت تستخدم هذه المكتبة في عملك الأكاديمي (كما أعرف أن العديد من الأشخاص) ، فيرجى العثور على bibtex هنا:
@software{Baccianella_JSON_Repair_-_2024,
author = {Baccianella, Stefano},
month = aug,
title = {{JSON Repair - A python module to repair invalid JSON, commonly used to parse the output of LLMs}},
url = {https://github.com/mangiucugna/json_repair},
version = {0.28.3},
year = {2024}
}
شكرًا لك على الإبلاغ عن عملي ويرجى إرسال رابط إلى الورقة إذا استطعت!
ستقوم هذه الوحدة بتحليل ملف JSON بعد تعريف BNF:
<json> ::= <primitive> | <container>
<primitive> ::= <number> | <string> | <boolean>
; Where:
; <number> is a valid real number expressed in one of a number of given formats
; <string> is a string of valid characters enclosed in quotes
; <boolean> is one of the literal strings 'true', 'false', or 'null' (unquoted)
<container> ::= <object> | <array>
<array> ::= '[' [ <json> *(', ' <json>) ] ']' ; A sequence of JSON values separated by commas
<object> ::= '{' [ <member> *(', ' <member>) ] '}' ; A sequence of 'members'
<member> ::= <string> ': ' <json> ; A pair consisting of a name, and a JSON value
إذا كان هناك شيء خاطئ (أقواس مفقود أو اقتباسات على سبيل المثال) ، فسيستخدم بعض الاستدلال البسيط لإصلاح سلسلة JSON:
أنا متأكد من أن بعض حالات الزاوية ستكون مفقودة ، إذا كان لديك أمثلة ، يرجى فتح مشكلة أو حتى دفع العلاقات العامة بشكل أفضل
ما عليك سوى إنشاء بيئة افتراضية مع requirements.txt
. txt ، يستخدم الإعداد مسبقًا للتأكد من إجراء جميع الاختبارات.
تأكد من أن إجراءات github تعمل بعد دفع التزام جديد لا تفشل أيضًا.
ستحتاج إلى وصول المالك إلى هذا المستودع
pyproject.toml
وتحديث رقم الإصدار بشكل مناسب باستخدام تدوين semver
python -m build