Этот простой пакет можно использовать для исправления недействительной строки JSON. Чтобы узнать все случаи, в которых этот пакет будет работать, ознакомьтесь с модульным тестом.
Если вы найдете эту библиотеку полезной, вы можете помочь мне, пожертвуя на мой ежемесячный бюджет пива здесь: https://github.com/sponsors/mangiucugna
Если вы не уверены, что эта библиотека решит вашу конкретную проблему или просто хотите, чтобы ваш JSON был подтвержден в Интернете, вы можете посетить демо -сайт на страницах GitHub: https://mangiucugna.github.io/json_repair/
Или услышать глубокий звук, генерируя Google Notebooklm для введения в модуль
Некоторые LLMS немного сомнительны, когда речь заходит о возвращении хорошо сформированных данных JSON, иногда они пропускают скобки, а иногда они добавляют в него несколько слов, потому что это то, что делает LLM. К счастью, ошибки, которые делают LLMS, достаточно просты, чтобы быть исправленными, не уничтожая контент.
Я искал легкий пакет Python, который смог надежно решить эту проблему, но не смог найти.
Итак, я написал один
В рамках моей работы мы используем API 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 Repair также предоставляет замену 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
to 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
to 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% знаете, что строка не является действительным JSONr"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
. Например:
json_repair==0.*
В этом примере любая версия, которая начинается с 0.
будет приемлемой, позволяя обновлять незначительные и патч -версии.
Если вы используете эту библиотеку в своей академической работе (как я знаю, многие люди), пожалуйста, найдите 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:
Я уверен, что некоторые угловые чехлы будут отсутствовать, если у вас есть примеры, пожалуйста, откройте проблему или даже лучше подтолкнуть PR
Просто создайте виртуальную среду с requirements.txt
.
Убедитесь, что действия GitHub, выполняемые после того, как выдвигали новый коммит, не подводят и не подводят.
Вам понадобится доступ владельца к этому репозиторию
pyproject.toml
и соответствующим образом обновите номер версии, используя нотацию semver
python -m build