533db535f1
build / build (push) Successful in 1m12s
按已确认需求提供独立安全模型配置、真实探测、正式字典字段评估与原问题译中,持久批次支持只补空白、暂停恢复、有限重试、幂等和逐字段依据。覆盖固定规则、本地语言、组织关联与主表有效看板共用治理侧读模型,保留源生产和冻结历史。 验证:完整 make verify 退出0,702项Go与329项前端通过;默认118项外部/隔离集成明确跳过,另跑完整镜像及组织隔离PG竞态。12并发、输入漂移、过期租约、暂停/恢复及有限重试通过。用户授权的百炼 deepseek-v4.1-flash 完成真实后台与浏览器评估/翻译;552行、16列、11块看板及完整PNG、独立配置页测试/保存、重开恢复和零JS异常通过。仅非业务样本外发,自动处理关闭,原payload不变。 上线前治理库已做导出快照原生备份并真实恢复,60表行数与17个QA表内容哈希一致;不修改DobotAI生产或隧道。本提交时尚未部署,线上验收须独立完成。
41 lines
687 B
Go
41 lines
687 B
Go
package strictjson
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
)
|
|
|
|
var ErrInvalid = errors.New("invalid JSON structure")
|
|
|
|
func Walk(d *json.Decoder) error {
|
|
token, err := d.Token()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if token == nil {
|
|
return ErrInvalid
|
|
}
|
|
if delimiter, ok := token.(json.Delim); ok {
|
|
if delimiter != '{' && delimiter != '[' {
|
|
return ErrInvalid
|
|
}
|
|
keys := map[string]bool{}
|
|
for d.More() {
|
|
if delimiter == '{' {
|
|
key, e := d.Token()
|
|
name, ok := key.(string)
|
|
if e != nil || !ok || keys[name] {
|
|
return ErrInvalid
|
|
}
|
|
keys[name] = true
|
|
}
|
|
if Walk(d) != nil {
|
|
return ErrInvalid
|
|
}
|
|
}
|
|
_, err = d.Token()
|
|
return err
|
|
}
|
|
return nil
|
|
}
|