拓冰建站拓冰建站
首页 / 资讯中心 / 正文

jid:Go 实现的交互式 JSON 增量挖掘工具 —— 点路径下钻、JMESPath 表达式与配置详解

CLI开发工具【免费下载链接】jidjson incremental digger项目地址https://gitcode.com/gh_mirrors/ji/jid点击查看免费下载jidJson Incremental Digger是一款用 Go 编写的交互式终端工具让你像使用 jq 一样编写过滤查询但无需一次写对——它支持增量下钻、自动补全、候选提示与 JMESPath 表达式实时在 JSON 视图中高亮命中的键。读完本文你将掌握 jid 的安装方式、Filter 交互操作、完整键位表、TOML 配置体系以及 JMESPath 模式下的通配符投影、函数候选与参数模板等进阶能力。jid 是什么面向交互式探索的 JSON 挖掘器jid 的核心使用场景非常纯粹从 stdin 读入 JSON进入一个交互式终端界面通过逐层深入的点路径dot-path查询把数据挖出来。它刻意保持简单却在简单之上提供了三项舒适体验Suggestion候选提示输入时实时展示可选的字段名或数组下标Auto completion自动补全Tab一键完成字段名输入无需完整手敲JMESPath 支持管道|、通配符[*]与内置函数keys()、sort_by(, name)等直接在过滤器中使用。从源码结构看整个仓库是一个自包含的 Go 模块见 go.mod核心入口为 cmd/jid/jid.go交互引擎位于 engine.goJSON 查询求值与 JMESPath 适配位于 json_manager.go。jid 的当前源码版本号为1.1.2cmd/jid/jid.go 中的VERSION常量。安装与构建通过系统包管理器安装jid 已被多个操作系统的包管理器收录安装命令如下平台命令macOSHomebrewbrew install jidmacOSMacPortssudo port install jidFreeBSDpkg install jidWindowsscoopscoop install jid此外其他 Linux 发行版等平台的包管理器也可能收录了 jid可以通过 Repology 的打包状态页查看各发行版的可用版本各仓库的维护情况以包管理器实际状态为准。直接使用 jid 命令如果只想立即使用jid命令可以从官方 Releases 页面下载对应平台的预编译二进制放入PATH即可运行。从源码构建需要 Go 工具链执行go install github.com/simeji/jid/cmd/jidlatestgo install会将可执行文件安装到$GOPATH/bin或$GOBIN目录。也可克隆本仓库后在cmd/jid目录下自行go build。快速上手三条命令进入交互界面简单 JSON 示例执行下面命令启动 jidecho {aa:2AA2,bb:{aaa:[123,cccc,[1,2]],c:321}}| jidjid 会立即进入交互模式。此时输入下钻查询.bb.aaa[2]屏幕将显示[Filter] .bb.aaa[2] [ 1, 2 ]按 Enter 键后jid 输出当前结果[1,2]并退出。这就是增量挖掘的基本节奏边看边敲边敲边看。多层嵌套与数组混合示例echo {info:{date:2016-10-23,version:1.0},users:[{name:simeji,uri:https://github.com/simeji,id:1},{name:simeji2,uri:https://example.com/simeji,id:2},{name:simeji3,uri:https://example.com/simeji3,id:3}],userCount:3}}|jid面对users这样的对象数组可以逐层下钻.users[0].name取第一个用户的姓名配合Tab补全可以全程几乎不完整敲字段名。携带初始查询启动jid的第一个命令行参数即初始查询启动后 Filter 中直接带上该查询例如echo ... | jid .users[0].name启动即定位到目标结果后续仍可继续编辑、下钻。与 curl 配合使用可以用管道串联任意数据源例如查询 RDAP注册数据访问协议数据curl -s http://rdg.afilias.info/rdap/domain/example.info | jid从文件加载 JSONjid file.json文件名通过重定向传入 stdin与管道方式等价。Filter 交互界面与点路径查询机制进入 jid 后底部是过滤输入行提示符固定为[Filter]常量FilterPrompt见 engine.go。若查询为空引擎会自动将其置为.表示根节点见 engine.go因此每次启动都从根 JSON 开始。点路径查询的解析遵循传统风格.分隔字段层级[N]定位数组下标例如.bb.aaa[2]。在传统模式下query.go 中的GetKeywords会把查询切分为关键字序列json_manager.go 的getFilteredDataLegacy按关键字逐个向下遍历节点——这就是下钻的底层实现。交互上的关键操作输入过程中候选字段名实时出现Tab补全ShiftTab反向循环候选或对已输入的下标[N]做递减数组结果会建议[0]、[N]等下标补全按Tab直接填入。完整键位表Keymaps以下是 jid 内置的默认键位。注意TAB与CTRLI等价termbox 中ctrli即 Tab见 keymap.go。keydescriptionTAB/CTRLIShow available items and choose them (cycles forward); highlights the matching key in the JSON viewShiftTABCycle candidates backward / decrement array indexCTRLWDelete one JMESPath segment backward (e.g..id→[0]→func()→ pipe)CTRLUDelete whole queryCTRLXToggle function description display (visible when function candidates are shown)CTRLF/ Right ArrowMove cursor a character to the rightCTRLB/ Left ArrowMove cursor a character to the leftCTRLATo the first character of the FilterCTRLETo the end of the FilterCTRLJScroll json buffer 1 line downwardsCTRLKScroll json buffer 1 line upwardsCTRLGScroll json buffer to bottomCTRLTScroll json buffer to topCTRLNScroll json buffer Page DownCTRLPScroll json buffer Page UpCTRLLChange view mode whole json or keys (only object)ESCHide a candidate boxUp ArrowNavigate to previous query in historyDown ArrowNavigate to next query in historyShiftTab 的固定转义序列ShiftTab在终端中对应固定的转义序列\x1b[Z它会以Esc → [ → Z三个独立事件到达。jid 在 engine.go 中专门检测这一序列先暂存候选状态并插入[若随后的字符是Z则撤销插入并执行shiftTabAction否则按普通[输入处理。因此ShiftTab 永远触发反向循环与配置项candidate_prev无关。Tab 的上下文敏感行为engine.go 的tabAction展示了Tab的完整语义处于候选模式时循环候选若 JMESPath 函数/字段候选只剩一个则直接确认查询以[N]结尾时递增数组下标ShiftTab递减并按父表达式长度做回绕以[*结尾时补全]形成通配符以[结尾时补全为[0]并把光标留在数字前结果为数组时补全[0]或[N]。命令行选项optiondescriptionFirst argument ($1)Initial query-hprint a help-helpprint a help-versionprint the version and exit-qOutput query mode (for jq)-Mmonochrome output mode选项解析见 cmd/jid/jid.go标准库flag。其中-qOutput query mode退出时不打印 JSON 结果而是打印最终查询字符串本身便于把交互探索得到的查询直接交给 jq 等工具离线复用对应run()中的qm分支见 cmd/jid/jid.go-M关闭颜色输出单色适合无彩色终端或重定向场景源码中还提供-ppretty print json result在输出最终结果时进行美化打印。配置文件 config.tomljid 通过 TOML 文件进行配置按操作系统约定路径查找os.UserConfigDir()见 config.goOSPathmacOS~/Library/Application Support/jid/config.tomlLinux~/.config/jid/config.tomlWindows%AppData%\jid\config.toml配置加载与合并机制config.go 的LoadConfig逻辑要点配置文件不存在时静默返回内置默认值不报错文件解析失败非法 TOML同样回退默认值采用字段级合并history、keybindings、behavior三个小节中只覆盖显式设置的字段未设置项全部保留默认。例如只写[keybindings] scroll_down ctrld其余键位不变由 config_test.go 的TestLoadConfigPartialOverride验证。完整示例 config.toml[history] path ~/.jid_history # custom history file path max_size 1000 # number of entries to keep [keybindings] history_prev up # navigate to older query history_next down # navigate to newer query scroll_down ctrlj scroll_up ctrlk scroll_to_bottom ctrlg scroll_to_top ctrlt scroll_page_down ctrln scroll_page_up ctrlp toggle_keymode ctrll delete_line ctrlu delete_word ctrlw cursor_left ctrlb cursor_right ctrlf cursor_to_start ctrla cursor_to_end ctrle toggle_func_help ctrlx candidate_next tab # cycle candidates forward candidate_prev ctrlp # cycle candidates backward (additional key; ShiftTab always works) quit ctrlq # exit jid (used when exit_on_enter false) [behavior] exit_on_enter true # set to false to prevent accidental exit on EnterNote:ShiftTab\x1b[Z是固定的终端转义序列无论candidate_prev如何配置它始终触发反向循环。各小节的作用域对应 config.go 中的结构体[history]path指定历史文件支持~展开max_size限制保留条目数默认 1000historyMaxSize见 history.go[keybindings]将动作名映射到按键字符串全部动作均有默认值见defaultConfig()config.gocandidate_prev是可选附加键仅在显式配置后才绑定到反向循环动作[behavior]目前仅exit_on_enter一项。防止误按 Enter 退出默认情况下按 Enter 会退出 jid 并打印当前结果对应引擎中KeyEnter分支见 engine.go。若经常误触退出可在config.toml中关闭[behavior] exit_on_enter false关闭后Enter 仅用于确认候选选择退出需使用CtrlQ或你配置的quit键。该开关的默认值逻辑在IsExitOnEnter()config.go未显式配置时返回true与旧版行为保持向后兼容。值得注意的是quit键绑定在 engine.go 中始终注册当exit_on_enter false时它就是唯一的退出通道退出前同样会保存查询历史。支持的按键字符串配置可用的按键字符串为ctrla…ctrlzupdownleftrighttabenterescbackspacehomeendpguppgdndeletef1…f12这些字符串由 keymap.go 的stringToKey表解析大小写不敏感、自动去空格源码中还额外识别insert键。若配置了无法识别的按键字符串resolveKey会静默回退到默认键位keymap.go。查询历史查询会在按 Enter 时自动保存引擎在退出分支调用history.Add与history.Save见 engine.go。历史文件路径遵循与配置文件相同的操作系统约定例如 macOS 为~/Library/Application Support/jid/history除非在config.toml的[history] path中覆盖。history.go 的实现细节保存时去重重复查询会被移动到列表末尾避免冗余Addhistory.go条目数超限时裁剪最旧的记录按max_size上下方向键按新→旧 / 旧→新浏览历史浏览时当前未提交的输入会被暂存浏览结束可恢复historyTmp见 engine.go空查询与.不写入历史。JMESPath 支持除传统点路径外jid 原生支持 JMESPath 表达式。当查询包含管道|、通配符[*]、过滤表达式[?或函数调用时JMESPath 模式自动激活源码中的判定函数isJMESPathQueryjson_manager.go还会额外识别多选哈希与裸引用。底层通过 json_manager.go 的jmespathExprFromQuery把 jid 的前导点查询转换为标准 JMESPath 表达式.→、.foo.bar→foo.bar再交由jmespath.Search求值。JMESPath 查询示例. traditional: show root JSON .users traditional: navigate to users field .users[0].name traditional: array index field access .users[*].name wildcard projection: extract name from every user .users[*].address.city nested wildcard projection .users[*].Tab show field candidates from array elements . | keys() pipe: list root object keys .users | length() pipe: count users array .users | sort_by(, name) pipe: sort users by name field .users | reverse() pipe: reverse the array .[1] | to_array()[0].id chained pipe with indexing . | to_array()[0] wrap root in array and index .users[*].name | [0] project names then index通配符投影 数组索引通配符投影如.game_indices[*].version的结果是一个数组用[N]继续进入下标导航jid 会在内部自动重写为管道形式.game_indices[*] → field candidates: game_index, version .game_indices[*].version → shows array of version objects; suggests [ .game_indices[*].version[0] → first version object {name, url} .game_indices[*].version[0].name → first versions name .game_indices[*].version[0] | keys() → keys of first version object .game_indices[*].version[0] | keys() | sort() → sorted keysNote: 标准 JMESPath 中[*].field[0]的[0]作用于每个投影元素而非投影后的数组结果为[]。jid 检测到该模式后透明地重写为[*].field | [0]使[0]索引整个数组。这一重写由正则reWildcardIndexedjson_manager.go识别并在直接求值出错或返回空数组时回退重试见evalBaseExprjson_manager.go。函数候选在字段后输入|jid 会根据前导表达式的类型过滤并展示可用的 JMESPath 函数Input typeSuggested functionsArrayavg,contains,join,length,map,max,max_by,min,min_by,not_null,reverse,sort,sort_by,sum,to_array,to_string,typeObjectkeys,length,merge,not_null,to_array,to_string,type,valuesStringcontains,ends_with,length,not_null,reverse,starts_with,to_array,to_number,to_string,typeNumberabs,ceil,floor,not_null,to_array,to_string,type类型过滤表定义于 suggestion.gojmespathFunctionsByType类型由GetCurrentType探测数组/对象/字符串/其他。候选列表下方会显示当前函数的用法说明可用CtrlX开关。候选键高亮匹配的 JSON 键会在视图中以黄色高亮并在两种情况下自动滚动到可见区域输入时——一旦查询收窄到唯一候选如输入.na而仅name匹配对应的键立即高亮无需按TabTab/ShiftTab循环时——随候选切换逐项高亮。实现上engine.go 的findKeyLineInContents在渲染内容中查找key:模式并选择缩进最浅嵌套层级最浅的匹配行因此同名嵌套键不会被误高亮候选键在可视区外时通过调整contentOffset自动滚动engine.go。函数参数模板确认函数候选后jid 会自动填入参数并把光标放到合适位置FunctionInserted asCursor positioncontainscontains(, )insideends_withends_with(, )insidestarts_withstarts_with(, )insidejoinjoin(, )inside(separator)sort_bysort_by(, field)onfieldplaceholdermax_bymax_by(, field)onfieldplaceholdermin_bymin_by(, field)onfieldplaceholdermapmap(expr, )onexprplaceholder模板表定义于 suggestion.gojmespathFuncTemplates包含参数字符串、光标回退偏移与占位符长度。占位符文本以青色显示输入任意字符即整体替换该占位符见 engine.go 的inputChar占位符替换逻辑。field候选补全对需要field参数的函数sort_by、max_by、min_by、map模板插入后 jid 会自动从基础数组展示可用的字段名.stats | sort_by(, field) → field names shown: base_stat effort stat .stats | sort_by(, b → filtered: base_stat .stats | sort_by(, base_stat) → confirmed; expression evaluates normallyTab / ShiftTab循环字段候选光标保持在与)之间输入按后的部分名过滤候选Enter或候选唯一时的Tab确认选择CtrlW删除字段名但保留如base_stat)→)。该交互由 json_manager.go 的ampFieldPartial检测函数参数中的后正在输入的部分标识符状态再由ampFieldCandidates基于基础表达式的首个数组元素生成字段候选确认逻辑见 engine.go。通配符投影导航通配符表达式如.game_indices[*]之后jid 会把数组元素的字段名作为候选展示.game_indices[*] → candidates: game_index, version .game_indices[*].Tab → same candidates (trailing dot still shows fields) .game_indices[*].vTab → filtered: version .game_indices[*].version → shows array result; suggests [ for index navigation .game_indices[*].version[0] → first version object; candidates: name, url底层逻辑位于 json_manager.go通配符表达式求值结果为数组时取首元素字段作为候选当通配符后正在输入部分字段名导致 JMESPath 静默丢弃空结果时则回退到基础通配符表达式进入字段补全模式json_manager.go。CtrlW 在 JMESPath 模式下的段删除CtrlW会从 JMESPath 表达式末尾一次删除一个段.[3] | to_array()[0].id →(CtrlW)→ .[3] | to_array()[0] .[3] | to_array()[0] →(CtrlW)→ .[3] | to_array() .[3] | to_array() →(CtrlW)→ .[3] | .[3] | →(CtrlW)→ .[3]函数调用内部的field参数被视为一个整体被保留.stats | max_by(, base_stat) →(CtrlW)→ .stats | max_by(, .stats | max_by(, →(CtrlW)→ .stats |该行为由 engine.go 的removeLastJMESPathSegment实现从右向左扫描追踪括号/方括号深度与字符串字面量边界依次回退字段.、下标[N]、函数调用并在函数内把field作为单次删除单元。深入源码jid 的运行时工作流以 cmd/jid/jid.go 为入口jid 的运行时链路如下NewEngineengine.go读取 stdin 构造JsonManager加载配置与历史设置初始查询Engine.Runengine.go初始化 termbox 终端进入事件循环每次刷新都重新求值当前查询、生成补全/候选数据并绘制界面求值由 json_manager.go 的GetFilteredData分发——含 JMESPath 语法则走getFilteredDataJMESPath否则走传统的getFilteredDataLegacy按 Enter或退出键时保存历史、输出结果并退出。值得留意的工程细节终端交互基于termbox-go查询输入以 rune 序列管理query.go并包含一套validate规则校验查询合法性禁止连续点、非法括号组合等见 query.go。从源码继续深入本文所有功能点均可在仓库对应文件中找到实现与测试佐证命令行入口与选项cmd/jid/jid.go交互引擎、键位分发、ShiftTab 检测、段删除engine.go配置结构、默认值与字段级合并config.go、config_test.go历史记录的去重保存与容量控制history.go按键字符串解析keymap.go查询解析与合法性校验query.go补全、函数候选、参数模板与类型过滤suggestion.goJSON 求值、JMESPath 转换与通配符重写json_manager.go搭配各*_test.go测试文件阅读可以快速验证文中描述的各项行为。总的来说jid 把用查询语言过滤 JSON这件事做成了沉浸式的交互体验传统点路径保证简单场景零学习成本JMESPath 模式覆盖复杂提取而补全、候选、高亮与参数模板则让两种模式都尽可能少打字、不犯错。赞分享CLI开发工具【免费下载链接】jidjson incremental digger项目地址https://gitcode.com/gh_mirrors/ji/jid点击查看免费下载相关推荐jid JSON增量挖掘工具终极交互式JSON查询完全指南jid JSON增量挖掘工具终极交互式JSON查询完全指南 想要快速挖掘和查询复杂的JSON数据吗 jid JSON增量挖掘工具就是你的最佳选择作为一CLI开发工具【亲测免费】 JsonPathJava中的JSON路径表达式解析工具JsonPathJava中的JSON路径表达式解析工具 项目基础介绍和主要编程语言 JsonPath是一个开源的Java项目旨在提供一种类似于XPath的表后端EMQX Variform 表达式新增 json_value 与 jwt_value用点路径从 JSON 与 JWT 中提取值EMQX Variform 表达式新增 json_value 与 jwt_value用点路径从 JSON 与 JWT 中提取值 导读 EMQX 在 Varif后端物联网消息队列通信上一篇Emscripten错误报告详细程度平衡信息量与隐私下一篇deit_tiny_patch16_224.fb_in1k模型调优指南参数配置与数据预处理最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门