แพ็คเกจง่ายๆนี้สามารถใช้เพื่อแก้ไขสตริง JSON ที่ไม่ถูกต้อง หากต้องการทราบทุกกรณีที่แพ็คเกจนี้ใช้งานได้ให้ตรวจสอบการทดสอบหน่วย
หากคุณพบว่าห้องสมุดนี้มีประโยชน์คุณสามารถช่วยฉันได้โดยบริจาคให้กับงบประมาณเบียร์รายเดือนของฉันที่นี่: https://github.com/sponsors/mangiucugna
หากคุณไม่แน่ใจว่าห้องสมุดนี้จะแก้ไขปัญหาเฉพาะของคุณหรือเพียงแค่ต้องการให้ JSON ตรวจสอบความถูกต้องทางออนไลน์คุณสามารถเยี่ยมชมเว็บไซต์สาธิตในหน้า GitHub: https://mangiucugna.github.io/json_repair/
หรือได้ยินเสียง DeepDive ที่สร้างขึ้นโดย Notebooklm ของ Google สำหรับการแนะนำโมดูล
LLM บางตัวมีความสามารถเล็กน้อยเมื่อพูดถึงการส่งคืนข้อมูล JSON ที่เกิดขึ้นอย่างดีบางครั้งพวกเขาก็ข้ามวงเล็บและบางครั้งพวกเขาก็เพิ่มคำบางคำในนั้นเพราะนั่นคือสิ่งที่ LLM ทำ โชคดีที่ความผิดพลาด LLMS ทำนั้นง่ายพอที่จะแก้ไขได้โดยไม่ทำลายเนื้อหา
ฉันค้นหาแพ็คเกจ Python ที่มีน้ำหนักเบาซึ่งสามารถแก้ไขปัญหานี้ได้อย่างน่าเชื่อถือ แต่ไม่พบ
ดังนั้นฉันจึงเขียนหนึ่ง
เป็นส่วนหนึ่งของงานของฉันเราใช้ OpenAI APIs และเราสังเกตเห็นว่าแม้จะมีผลลัพธ์ที่มีโครงสร้างบางครั้งผลลัพธ์ก็ไม่ได้เป็น 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
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
จะเร็วขึ้นเสมอเพราะตัวแยกวิเคราะห์ส่งคืนวัตถุแล้วskip_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.
จะเป็นที่ยอมรับได้อนุญาตให้มีการอัปเดตในรุ่นรองและแพตช์
หากคุณใช้ห้องสมุดนี้ในงานวิชาการของคุณ (อย่างที่ฉันรู้ว่ามีคนมากมาย) โปรดค้นหา 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
การตั้งค่าจะใช้ล่วงหน้าเพื่อให้แน่ใจว่าการทดสอบทั้งหมดทำงาน
ตรวจสอบให้แน่ใจว่าการกระทำของ GitHub ทำงานหลังจากผลักดันการกระทำใหม่ไม่ล้มเหลวเช่นกัน
คุณจะต้องเข้าถึงเจ้าของที่เก็บนี้
pyproject.toml
และอัปเดตหมายเลขเวอร์ชันอย่างเหมาะสมโดยใช้สัญกรณ์ semver
python -m build