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

jq报错tostring/1未定义:JSON数组数值转字符串拼接求助

问题:jq拼接JSON字符串与数值报错的解决方法

问题详情

我有一个JSON对象数组,想要提取其中的id和time字段拼接成字符串。尝试执行以下命令:

cat a.json | jq 'map(.id+" "+tostring(.time))'

但出现报错:

jq: error: tostring/1 is not defined at <top-level>, line 1:

如果省略tostring,又会因为time是数值类型,和字符串类型的id无法直接拼接,出现类型不兼容问题。目前能用sed+tr做变通,但这种方式不够优雅,求合适的解决方法。

示例输入JSON:

[{
    "id": "399",
    "time": 1705655705
},
{
    "id": "409",
    "time": 1723587399
}]

解决方法

核心原因

报错是因为你使用的jq版本过低——tostring/1函数是jq 1.5及以后版本才引入的,旧版本不支持直接这样调用。下面是几种更优雅的解决方案:

1. 用字符串插值语法(推荐)

jq支持"\(变量)"的插值语法,会自动将数值转为字符串,写法更简洁直观:

cat a.json | jq 'map("\(.id) \(.time)")'

执行后输出:

[
  "399 1705655705",
  "409 1723587399"
]

2. 兼容旧版本jq的tostring写法

如果必须使用tostring,需要把它放在管道里,让数值先经过tostring转换再拼接:

cat a.json | jq 'map(.id + " " + (.time | tostring))'

这样就能正确完成类型转换和拼接,输出结果和上面一致。

3. 输出纯文本(无需JSON数组格式)

如果最终只需要每行一个拼接后的字符串,不需要JSON数组的包裹,可以加上-r(raw输出)参数,配合.[]遍历数组元素:

cat a.json | jq -r '.[] | "\(.id) \(.time)"'

执行后输出:

399 1705655705
409 1723587399

内容的提问来源于stack exchange,提问作者P.Péter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:00:09