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

如何在jq的startswith函数中使用.fieldname字段?

解决jq中startswith引用字段的报错问题

问题重现

想要实现逻辑:若last_name以first_name开头则输出last_name,否则输出first_name与last_name的拼接,但执行脚本时出现错误:

$ echo '{"first_name": "John", "last_name": "Johnson"}' | jq -c '{
  "name": (if (.last_name | startswith(.first_name)) 
           then .last_name 
           else .first_name + " " + .last_name 
           end)
}'

错误信息:

jq: error (at <stdin>:1): Cannot index string with string "first_name"

错误原因

使用.last_name | startswith(.first_name)时,管道操作会将当前上下文切换为.last_name的字符串值,此时再尝试访问.first_name,相当于在字符串类型上索引字段,自然触发报错。

解决方案

有两种简单的修复方式:

方式1:用变量保存first_name的值

先将first_name存入变量,避免上下文切换导致的字段访问问题:

echo '{"first_name": "John", "last_name": "Johnson"}' | jq -c '
  .first_name as $first |
  {
    "name": (if .last_name | startswith($first)
             then .last_name
             else .first_name + " " + .last_name
             end)
  }
'

方式2:引用根对象的first_name字段

使用$引用整个输入对象,直接访问根对象下的first_name,不受管道上下文影响:

echo '{"first_name": "John", "last_name": "Johnson"}' | jq -c '{
  "name": (if (.last_name | startswith($.first_name)) 
           then .last_name 
           else .first_name + " " + .last_name 
           end)
}'

两种方式都能正确处理不同first_name的批量记录,针对示例输入的输出结果为:

{"name":"Johnson"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:03:16