Paket sederhana ini dapat digunakan untuk memperbaiki string JSON yang tidak valid. Untuk mengetahui semua kasus di mana paket ini akan berfungsi, lihat tes unit.
Jika Anda menemukan perpustakaan ini bermanfaat, Anda dapat membantu saya dengan menyumbang untuk anggaran bir bulanan saya di sini: https://github.com/sponsors/mangiucugna
Jika Anda tidak yakin apakah perpustakaan ini akan memperbaiki masalah spesifik Anda, atau hanya ingin JSON Anda divalidasi secara online, Anda dapat mengunjungi situs demo di halaman github: https://mangiucugn.github.io/json_repair/
Atau dengarkan audio DeepDive yang dihasilkan oleh Google's Notebooklm untuk pengantar modul
Beberapa LLM agak rapuh ketika harus mengembalikan data JSON yang terbentuk dengan baik, kadang -kadang mereka melewatkan tanda kurung dan kadang -kadang mereka menambahkan beberapa kata di dalamnya, karena itulah yang dilakukan LLM. Untungnya, kesalahan yang dilakukan LLMS cukup sederhana untuk diperbaiki tanpa menghancurkan konten.
Saya mencari paket python ringan yang dapat dengan andal memperbaiki masalah ini tetapi tidak dapat menemukannya.
Jadi saya menulis satu
Sebagai bagian dari pekerjaan saya, kami menggunakan API Openai dan kami memperhatikan bahwa bahkan dengan output terstruktur kadang -kadang hasilnya bukan JSON yang sepenuhnya valid. Jadi kami masih menggunakan perpustakaan ini untuk menutupi outlier tersebut.
Instal perpustakaan dengan PIP
pip install json-repair
maka Anda dapat menggunakannya menggunakannya di kode Anda seperti ini
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
Anda dapat menggunakan pustaka ini untuk sepenuhnya menggantikan json.loads()
:
import json_repair
decoded_object = json_repair.loads(json_string)
atau adil
import json_repair
decoded_object = json_repair.repair_json(json_string, return_objects=True)
Beberapa pengguna perpustakaan ini mengadopsi pola berikut:
obj = {}
try:
obj = json.loads(string)
except json.JSONDecodeError as e:
obj = json_repair.loads(string)
...
Ini sia -sia karena json_repair
sudah akan memverifikasi untuk Anda jika JSON valid, jika Anda masih ingin melakukannya maka tambahkan skip_json_loads=True
untuk panggilan seperti yang dijelaskan bagian di bawah ini.
Perbaikan JSON juga memberikan penggantian drop-in untuk json.load()
:
import json_repair
try:
file_descriptor = open(fname, 'rb')
except OSError:
...
with file_descriptor:
decoded_object = json_repair.load(file_descriptor)
dan metode lain untuk dibaca dari file:
import json_repair
try:
decoded_object = json_repair.from_file(json_file)
except OSError:
...
except IOError:
...
Perlu diingat bahwa perpustakaan tidak akan menangkap pengecualian terkait IO dan itu perlu dikelola oleh Anda
Saat bekerja dengan karakter non-Latin (seperti Cina, Jepang, atau Korea), Anda perlu lulus ensure_ascii=False
ke repair_json()
untuk melestarikan karakter non-Latin dalam output.
Berikut contoh menggunakan karakter Cina:
repair_json("{'test_chinese_ascii':'统一码'}")
akan kembali
{"test_chinese_ascii": "u7edfu4e00u7801"}
Alih -alih melewati ensure_ascii=False
:
repair_json("{'test_chinese_ascii':'统一码'}", ensure_ascii=False)
akan kembali
{"test_chinese_ascii": "统一码"}
Jika Anda menemukan perpustakaan ini terlalu lambat karena menggunakan json.loads()
Anda dapat melewatinya dengan melewati skip_json_loads=True
to repair_json
. Menyukai:
from json_repair import repair_json
good_json_string = repair_json(bad_json_string, skip_json_loads=True)
Saya membuat pilihan untuk tidak menggunakan perpustakaan JSON cepat untuk menghindari ketergantungan eksternal, sehingga siapa pun dapat menggunakannya terlepas dari tumpukan mereka.
Beberapa aturan praktis untuk digunakan:
return_objects=True
akan selalu lebih cepat karena parser sudah mengembalikan objek dan tidak memiliki serial objek itu ke jsonskip_json_loads
lebih cepat hanya jika Anda 100% tahu bahwa string itu bukan JSON yang validr"string with escaping""
Instal perpustakaan untuk baris perintah dengan:
pipx install json-repair
Untuk mengetahui semua opsi yang tersedia:
$ 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)
Harap sematkan perpustakaan ini hanya pada versi utama!
Kami menggunakan TDD dan versi semantik yang ketat, akan ada pembaruan yang sering dan tidak ada perubahan dalam versi minor dan patch. Untuk memastikan bahwa Anda hanya menyematkan versi utama perpustakaan ini dalam requirements.txt
Anda.txt, tentukan nama paket yang diikuti oleh versi utama dan wildcard untuk versi minor dan patch. Misalnya:
json_repair==0.*
Dalam contoh ini, versi apa pun yang dimulai dengan 0.
akan dapat diterima, memungkinkan pembaruan pada versi minor dan patch.
Jika Anda menggunakan perpustakaan ini dalam pekerjaan akademik Anda (seperti yang saya tahu banyak orang) silakan temukan Bibtex di sini:
@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}
}
Terima kasih telah mengutip pekerjaan saya dan tolong kirimkan saya tautan ke kertas jika Anda bisa!
Modul ini akan mengurai file JSON mengikuti definisi 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
Jika ada sesuatu yang salah (tanda kurung atau kutipan yang hilang misalnya) itu akan menggunakan beberapa heuristik sederhana untuk memperbaiki string JSON:
Saya yakin beberapa kasus sudut akan hilang, jika Anda memiliki contoh, buka masalah atau bahkan lebih baik mendorong PR
Cukup buat lingkungan virtual dengan requirements.txt
, pengaturan menggunakan pra-komit untuk memastikan semua tes dijalankan.
Pastikan bahwa tindakan GitHub berjalan setelah mendorong komit baru tidak gagal juga.
Anda akan membutuhkan akses pemilik ke repositori ini
pyproject.toml
dan perbarui nomor versi dengan tepat menggunakan notasi semver
python -m build