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

使用jq解析JSON字符串中的数组与对象值时gsub失效求助

问题描述

我有一段JSON字符串:

json_string="{\"emailRecipients\":\"['test@example.com', 'tes2t@example.com', 'test3@example.com']\", \"anotherEmails\":\"{'test1': 'test1@example.com', 'test2': 'test2@example.com', 'test3': 'test3@example.com'}\", \"some_key\": 3, \"another_key\": \"some_value\"}"

我希望用jq将其中emailRecipients解析为JSON数组,anotherEmails解析为JSON对象,同时编写适用于任意键的通用命令,保留非JSON数组/对象类型的键值对不变。我尝试了以下命令:

parsed_json=$(echo "$json_string" | jq 'with_entries(
    .value |= if startswith("\"[") and endswith("\"]") then
        gsub("''";"\"") | fromjson
    else
        .
    end
)')

但gsub未生效,请问我哪里出错了?

错误分析与解决方案

错误原因

  1. 匹配逻辑错误:当json_string被jq解析后,emailRecipients的实际值是['test@example.com', ...](外层双引号是shell转义的JSON字符串边界,jq解析后会去掉),你的startswith("\"[")判断完全不成立,根本没进入gsub处理分支。
  2. 替换规则错误:原字符串里的单引号是单个',你写的gsub("''";"\"")是替换连续两个单引号,自然不会生效。

正确通用命令

下面的命令能同时处理数组、对象格式的字符串值,替换单引号为双引号后解析成JSON类型,其他类型值保持不变:

parsed_json=$(echo "$json_string" | jq 'with_entries(
    .value |= (
        if type == "string" then
            if startswith("[") or startswith("{") then
                gsub("'\\''"; "\"") | fromjson
            else
                .
            end
        else
            .
        end
    )
)')

命令说明

  • 先判断值为字符串类型才处理,避免干扰数字、原生JSON结构等类型。
  • 匹配以[(数组)或{(对象)开头的字符串,统一替换其中的单引号为双引号。
  • '\\''是shell环境下对单引号的转义写法,确保jq能正确识别要替换的字符。
  • 替换完成后用fromjson将字符串解析为真正的JSON数组/对象。

执行该命令后,emailRecipients会转为JSON数组,anotherEmails转为JSON对象,some_key和another_key保持原类型不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:06:03