Help us shape the future of Go! Take the 2026 Go Developer Survey

jsonrepair

package
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 15, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package jsonrepair LLM 输出宽容 JSON 修复骨架:栅栏剥离 → 散文抽对象 → 语法级修复 → 标量归一。报告/领域 schema 由调用方持有;本包只做格式宽容。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CoerceString

func CoerceString(v any) (string, bool)

CoerceString coerceString 的导出面:调用方在 Schema.OnMap 域内钩子里做 自定义归一(枚举收敛/布尔翻转等)时复用同一标量 coerce 口径,避免再造平行实现。

func ExtractJSON

func ExtractJSON(s string) string

ExtractJSON 从模型输出中提取 JSON 文本:剥 ``` 围栏(语义单源 textutil.StripCodeFence——取第一个围栏块)、截取首个 {/[ 到末个 }/]。 快路径切片,不做语法修复——半损坏输出的宽容解析走 Unmarshal/ParseLenient; 两者围栏语义一致,宽容回退链不会静默换目标块。

func ExtractObject

func ExtractObject(s string) string

ExtractObject 提取文本中第一个平衡的 JSON 对象(字符串字面量感知; 未闭合则返回剩余文本由 Repair 补全括号)。无对象返回 ""。

func Normalize

func Normalize(raw json.RawMessage, schema *Schema) (string, error)

Normalize 把字符串位的 bool/数字统一转成文本(宽容留给格式,拦截留给白名单)。 raw 非法 JSON 时返回 error。

func ParseLenient

func ParseLenient(raw string, v any, schema *Schema) error

ParseLenient 栅栏剥离 → 直接解析 → Repair 重试 → ExtractObject+Repair 重试。 schema 为 nil 时跳过 Normalize(空 schema 下归一仍是 Unmarshal+递归+Marshal 三趟纯开销,对解析结果无贡献)。

func Repair

func Repair(s string) string

Repair 轻量 JSON 修复:全角结构标点、非法转义(如 \| → |)、尾逗号、未闭合 括号。只处理语法级损坏;语义归一化由 Normalize / 调用方承担。

单遍字符串感知扫描(第六轮审计重构):此前尾逗号/非法转义走全文正则、不辨 字符串边界——字符串里合法的 `", }"` / `"\x"` 序列会被当损坏静默改写(修复器 的错误成功比失败更贵)。现在三类修复共用一个 inStr/esc 状态机,与 scanOpenBrackets/ExtractObject 同一纪律:字符串外才动结构位,字符串内只修 转义。

func Unmarshal

func Unmarshal(text string, v any) error

Unmarshal 模型输出 JSON 的宽容解析出口,三级尝试:

  1. ExtractJSON + encoding/json——快路径,命中则零额外开销;
  2. 切片结果经 Repair 做语法级修复(全角结构符/非法转义/尾逗号/未闭合括号) 后再解析;
  3. ParseLenient 全链兜底(剥围栏→直解→修复→抽对象,可救散文包裹与截断)。

全部失败时返回同时携带严格与宽容两路错误的包装——调用方把它回喂 LLM 重试时 无需再自行拼装失败原因。宿主的领域 schema 校验(字段语义、枚举约束)仍归调用方。

Types

type Schema

type Schema struct {
	// StringKeys 期望为字符串的键:bool/数字 → 文本;对象/数组 → 扁平化文本。
	StringKeys map[string]bool
	// ListKeys 期望为数组的键:标量 → 单元素数组(或空数组);元素内标量 → 文本。
	ListKeys map[string]bool
	// OnMap 每个 map 在其子节点归一完成后的领域钩子(可 nil)。可增删改键。
	OnMap func(m map[string]any)
}

Schema 标量归一化作用范围(领域键集合由调用方提供)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL