You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JQ转换Raw JSON Lines格式数据中的枚举值?

用JQ实现JSON Lines中枚举值的转换

当然可以!JQ完全能轻松搞定这种数字到字符串枚举的转换,而且有几种灵活的实现方式,我给你详细说说:

方法一:直接在表达式中定义映射

这是最直接的方式,把数字和对应字符串的映射直接写在JQ表达式里:

cat test.log | jq -rR 'fromjson? | "[\({20: "debug", 30: "info", 40: "warn"}[.level])] \(.msg)"'

原理解释:

  • {20: "debug", 30: "info", 40: "warn"} 是我们定义的映射对象,键是原始的level数字,值是我们想要转换后的字符串。
  • [.level] 会用当前JSON对象里的level值作为键,从映射对象中取出对应的字符串。
  • 剩下的部分和你原来的命令逻辑一致,把转换后的level和msg格式化成需要的字符串。

用这个命令处理你的示例输入,就能得到你期望的输出:

[debug] Debug message
[info] Info message
[info] Info message
[warn] Warn message
[debug] Debug message

方法二:通过参数传入映射(适合复杂场景)

如果你的映射规则比较复杂,或者需要在多个地方复用,推荐用--argjson参数把映射对象传入JQ,这样命令会更清晰:

cat test.log | jq -rR 'fromjson? | $level_map[.level] as $level_str | "[\($level_str)] \(.msg)"' --argjson level_map '{"20":"debug","30":"info","40":"warn"}'

原理解释:

  • --argjson level_map '{"20":"debug","30":"info","40":"warn"}' 把JSON格式的映射对象作为变量$level_map传入JQ。
  • $level_map[.level] as $level_str 取出对应转换后的字符串并赋值给变量$level_str,后续直接使用即可。

进阶:处理未定义的level值

如果日志中出现了映射里没有的level值(比如50),上面的方法会输出[null],可以用//操作符添加默认值,让输出更健壮:

cat test.log | jq -rR 'fromjson? | "[\({20: "debug", 30: "info", 40: "warn"}[.level] // "unknown")] \(.msg)"'

这样遇到未定义的level时,会显示[unknown],避免输出奇怪的null。

内容的提问来源于stack exchange,提问作者JHH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:43