Dieses einfache Paket kann verwendet werden, um eine ungültige JSON -Zeichenfolge zu beheben. Um alle Fälle zu kennen, in denen dieses Paket funktioniert, lesen Sie den Unit -Test.
Wenn Sie diese Bibliothek nützlich finden, können Sie mir helfen, indem Sie hier für mein monatliches Bierbudget spenden: https://github.com/sponsors/mangiucugna
Wenn Sie sich nicht sicher sind, ob diese Bibliothek Ihr spezifisches Problem behebt oder einfach nur Ihr JSON online validiert hat, können Sie die Demo -Site auf Github -Seiten besuchen: https://mangiucugna.github.io/json_repair/
Oder hören
Einige LLMs sind ein bisschen zweifelhaft, wenn es darum geht, gut geformte JSON -Daten zurückzukehren. Manchmal überspringen sie eine Klammer und manchmal fügen sie einige Wörter hinzu, denn das ist das, was ein LLM tut. Zum Glück sind die Fehler, die LLMs machen, einfach genug, um zu fixieren, ohne den Inhalt zu zerstören.
Ich suchte nach einem leichten Python -Paket, das dieses Problem zuverlässig beheben konnte, aber keine finden konnte.
Also habe ich einen geschrieben
Als Teil meines Jobs verwenden wir OpenAI -APIs und wir haben festgestellt, dass das Ergebnis selbst bei strukturierter Ausgabe manchmal kein vollständig gültiger JSON ist. Deshalb verwenden wir diese Bibliothek immer noch, um diese Ausreißer abzudecken.
Installieren Sie die Bibliothek mit PIP
pip install json-repair
Dann können Sie es in Ihrem Code wie diesen verwenden
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
Sie können diese Bibliothek verwenden, um json.loads()
vollständig zu ersetzen:
import json_repair
decoded_object = json_repair.loads(json_string)
oder gerecht
import json_repair
decoded_object = json_repair.repair_json(json_string, return_objects=True)
Einige Benutzer dieser Bibliothek verwenden das folgende Muster:
obj = {}
try:
obj = json.loads(string)
except json.JSONDecodeError as e:
obj = json_repair.loads(string)
...
Dies ist verschwenderisch, da json_repair
bereits überprüft wird, ob der JSON gültig ist. Wenn Sie dies noch tun möchten, fügen Sie den Abschnitt unten auf den Anruf zu skip_json_loads=True
.
JSON Repair bietet auch einen Drop-In-Ersatz für json.load()
:
import json_repair
try:
file_descriptor = open(fname, 'rb')
except OSError:
...
with file_descriptor:
decoded_object = json_repair.load(file_descriptor)
und eine andere Methode zum Lesen einer Datei:
import json_repair
try:
decoded_object = json_repair.from_file(json_file)
except OSError:
...
except IOError:
...
Denken Sie daran, dass die Bibliothek keine Ausnahme im Zusammenhang mit IOs fängt und diese von Ihnen verwaltet werden müssen
Bei der Arbeit mit nicht-latinischen Zeichen (wie Chinesisch, Japanisch oder Koreanisch) müssen Sie ensure_ascii=False
, dass repair_json()
die Nicht-Latin-Zeichen im Ausgang bewahren.
Hier ist ein Beispiel mit chinesischen Zeichen:
repair_json("{'test_chinese_ascii':'统一码'}")
wird zurückkehren
{"test_chinese_ascii": "u7edfu4e00u7801"}
Stattdessen bestehen sicher, ensure_ascii=False
:
repair_json("{'test_chinese_ascii':'统一码'}", ensure_ascii=False)
wird zurückkehren
{"test_chinese_ascii": "统一码"}
Wenn Sie diese Bibliothek zu langsam finden, da Sie json.loads()
verwenden können, können Sie diese überspringen, indem Sie skip_json_loads=True
to repair_json
übergeben. Wie:
from json_repair import repair_json
good_json_string = repair_json(bad_json_string, skip_json_loads=True)
Ich habe die Wahl getroffen, keine schnelle JSON -Bibliothek zu verwenden, um eine externe Abhängigkeit zu vermeiden, damit jeder sie unabhängig von seinem Stapel verwenden kann.
Einige Faustregeln zu verwenden:
return_objects=True
ist immer schneller, da der Parser bereits ein Objekt zurückgibt und dieses Objekt nicht mit JSON serialisiert wirdskip_json_loads
ist nur schneller, wenn Sie zu 100% wissen, dass die Zeichenfolge kein gültiger JSON istr"string with escaping""
Installieren Sie die Bibliothek für die Befehlszeile mit:
pipx install json-repair
um alle verfügbaren Optionen zu kennen:
$ 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)
Bitte stecken Sie diese Bibliothek nur auf die Hauptversion!
Wir verwenden TDD und strenge semantische Versioning, es werden häufige Updates und keine Bruchänderungen in Minor- und Patch -Versionen geben. Um sicherzustellen, dass Sie nur die Hauptversion dieser Bibliothek in Ihren requirements.txt
anpassen. Zum Beispiel:
json_repair==0.*
In diesem Beispiel ist jede Version, die mit 0.
beginnt, akzeptabel und ermöglicht Updates zu Minor- und Patch -Versionen.
Wenn Sie diese Bibliothek in Ihrer akademischen Arbeit verwenden (wie ich weiß, viele Leute sind), finden Sie hier das 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}
}
Vielen Dank, dass Sie meine Arbeit zitiert haben, und bitte senden Sie mir einen Link zum Papier, wenn Sie können!
In diesem Modul wird die JSON -Datei nach der BNF -Definition analysiert:
<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
Wenn etwas nicht stimmt (z.
Ich bin sicher, dass einige Eckfälle fehlen werden. Wenn Sie Beispiele haben
Erstellen Sie einfach eine virtuelle Umgebung mit requirements.txt
. Das Setup verwendet Pre-Commit, um sicherzustellen, dass alle Tests ausgeführt werden.
Stellen Sie sicher, dass die Github -Aktionen, die nach dem Drücken eines neuen Commits ausgeführt werden, nicht ebenfalls scheitern.
Sie benötigen den Zugriff des Besitzers auf dieses Repository
pyproject.toml
und aktualisieren Sie die Versionsnummer mithilfe der semver
-Notation angemessenpython -m build
laufen