使用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未生效,请问我哪里出错了?
错误分析与解决方案
错误原因
- 匹配逻辑错误:当
json_string被jq解析后,emailRecipients的实际值是['test@example.com', ...](外层双引号是shell转义的JSON字符串边界,jq解析后会去掉),你的startswith("\"[")判断完全不成立,根本没进入gsub处理分支。 - 替换规则错误:原字符串里的单引号是单个
',你写的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
相关产品推荐
相关产品推荐

