go-openapi/jsonpointer
GitHub: go-openapi/jsonpointer
一个 Go 语言实现的 JSON Pointer(RFC6901)库,支持对 struct 进行动态路径取值与设值操作。
Stars: 51 | Forks: 19
# jsonpointer
[][test-url] [][cov-url] [][vuln-scan-url] [][codeql-url]
[][release-url] [][gocard-url] [][codefactor-url] [][license-url]
[][godoc-url] [][discord-url] [][goversion-url]  
JSON Pointer 的 golang 实现,支持 go `struct`。
## 公告
* **2026-06-29** : 重新内部化了外部依赖到 swag (v0.24.0)
* 模块 `github.com/go-openapi/swag/jsonname` 的源码已直接移至此处,因此我们不再有任何外部依赖
* `jsonname` 几乎从未被其他任何包使用过,因此将其从 `swag` 系列中弃用并在该处重构其功能是合理的。除了测试依赖外,`jsonpointer` 不再获取外部依赖。
* **2026-04-15** : 新增了对数组尾部 "-" 的支持 (v0.23.0)
* 这带来了对 [RFC6901][RFC6901] 的全面支持
* 这对于依赖基于反射实现的类型是受支持的
* API 语义基本保持不变。例外情况:`Pointer.Set(document any,value any) (document any, err error)`
只能尽最大努力原地修改输入文档。在使用尾部 "-" 向数组添加元素的情况下,
请传入可变数组(`*[]T`)作为输入文档,或者使用返回的更新后的文档。
* 实现了 `JSONSetable` 接口的类型可能不支持由尾部 "-" 隐含的修改操作
* **2026-04-15** : 新增了对可选备用 JSON 名称提供者的支持
* 对于结构体支持,默认设置可能并不适合所有情况:在处理无标签的字段或嵌入类型时存在已知的局限性。
* 当前使用的默认名称提供者与 go JSON stdlib 并未完全对齐
* 暴露了一个选项(或全局设置)来更改将结构体解析为 json 键的提供者
* 默认行为未发生改变
## 状态
API 稳定且功能完备。
该项目将继续接受定期更新、bug 修复和常规维护(CI、代码检查等)。
## 在你的项目中导入此库
```
go get github.com/go-openapi/jsonpointer
```
## 基本用法
另请参阅一些[示例](./examples_test.go)
### 获取值
```
import (
"github.com/go-openapi/jsonpointer"
)
var doc any
...
pointer, err := jsonpointer.New("/foo/1")
if err != nil {
... // error: e.g. invalid JSON pointer specification
}
value, kind, err := pointer.Get(doc)
if err != nil {
... // error: e.g. key not found, index out of bounds, etc.
}
...
```
### 设置值
```
...
var doc any
...
pointer, err := jsonpointer.New("/foo/1")
if err != nil {
... // error: e.g. invalid JSON pointer specification
}
doc, err = p.Set(doc, "value")
if err != nil {
... // error: e.g. key not found, index out of bounds, etc.
}
```
## 更新日志
请参阅
## 参考资料
也被称为 [RFC6901][RFC6901]。
## 许可协议
本库基于 [SPDX-License-Identifier: Apache-2.0](./LICENSE) 协议发布。
请参阅许可 [NOTICE](./NOTICE),其中回顾了构建本软件所依赖的所有软件组件的许可条款。
## 局限性
* 现在完全支持 [RFC6901][RFC6901],包括针对数组的尾部 "-" 语义(用于 `Set` 操作)。
* 默认行为:go `struct` 中的 JSON 名称检测
- 与 go 标准序列化不同,无标签的字段不会默认使用 go 字段名,而是会被忽略。
- 如果匿名字段没有标签,则不会被遍历
- 上述局限性可通过在初始化时调用 `UseGoNameProvider()` 来克服。
- 或者,用户可以作为选项注入所需的自定义字段命名行为。
## 其他文档
## 发布新版本
维护者可以通过以下任一方式发布新版本:
* 运行[此工作流](https://github.com/go-openapi/jsonpointer/actions/workflows/bump-release.yml)
* 或推送一个 semver 标签
* 推荐使用签名标签
* 标签信息会被追加到发行说明的开头
标签:EVTX分析, Golang, JSON Pointer, RFC6901, 安全编程, 开发库, 数据解析, 日志审计