如何使用jq将JSON嵌套子对象的双引号替换为单引号
问题场景
有一份待导入数据库的JSON文本文件,预处理已基本完成,剩余格式调整需求:使用jq工具,将JSON所有嵌套层级子对象、对应值的双引号替换为单引号,顶层键值的双引号保留。
示例输入
{"foo":"bar","ping":{"pong":"ping-pong","n":[{"a":1},{"b":2}]},"alpha":"beta","hello":"there!","you":"2"}
期望输出
{"foo":"bar","ping":{'pong':'ping-pong','n':[{'a':1},{'b':2}]}, "alpha":"beta","hello":"there!","you":"2"}
实现方案
首先明确:最终输出不是标准JSON格式(标准JSON仅支持双引号包裹键和字符串值),仅适配特定数据库导入的自定义格式要求。
执行以下jq命令即可完成转换:
jq -c ' to_entries | map( if .value | type | IN("object", "array") then (.key | tojson) + ":" + ((.value | tojson) | gsub("\"";"'\\''")) else (.key | tojson) + ":" + (.value | tojson) end ) | join(",") | "{\(.)}" ' target.json
命令逻辑说明
-c参数指定输出紧凑无缩进格式,和示例输出格式匹配to_entries将顶层JSON对象拆分为由{key: 键名, value: 键值}组成的数组,方便逐一枚举顶层字段处理- 对每个顶层字段判断值类型:
- 如果值是对象或数组(即存在嵌套结构),先将嵌套值序列化为标准JSON字符串,再全局替换字符串内所有双引号为单引号
- 如果值是字符串、数字、布尔值等基础类型,直接保留标准JSON的双引号格式
- 最后将处理完的所有键值对用逗号拼接,外层包裹大括号,得到最终结果
注意:转换后的内容无法被标准JSON解析器识别,仅可用于指定的非标准导入场景。
内容的提问来源于stack exchange,提问作者M Ahmad Mujtaba
相关产品推荐
相关产品推荐

