go-openapi/jsonpointer

GitHub: go-openapi/jsonpointer

一个 Go 语言实现的 JSON Pointer(RFC6901)库,支持对 struct 进行动态路径取值与设值操作。

Stars: 51 | Forks: 19

# jsonpointer [![Tests](https://static.pigsec.cn/wp-content/uploads/repos/cas/db/dbc20fbb5b43d751115743b728bc221bb9cb0a7c6247701ddba81ac8c7acc81e.svg)][test-url] [![Coverage](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)][cov-url] [![CI vuln scan](https://static.pigsec.cn/wp-content/uploads/repos/cas/f3/f38b970f8dc114adca53ef9669122f3bf5a0a92b76f1cededc8e5af7f9b597c7.svg)][vuln-scan-url] [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539e9a6bf48ad24469a4363bff3aa68124154549e26592783d3d8577f2acbbfc.svg)][codeql-url] [![Release](https://badge.fury.io/gh/go-openapi%2Fjsonpointer.svg)][release-url] [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/jsonpointer)][gocard-url] [![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/go-openapi/jsonpointer)][codefactor-url] [![License](http://img.shields.io/badge/license-Apache%20v2-orange.svg)][license-url] [![GoDoc](https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer)][godoc-url] [![Discord Channel](https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue)][discord-url] [![go version](https://img.shields.io/github/go-mod/go-version/go-openapi/jsonpointer)][goversion-url] ![Top language](https://img.shields.io/github/languages/top/go-openapi/jsonpointer) ![Commits since latest release](https://img.shields.io/github/commits-since/go-openapi/jsonpointer/latest) 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, 安全编程, 开发库, 数据解析, 日志审计