如何在KSH/BASH脚本中静态/动态构造普通及嵌套JSON对象
KSH/BASH 环境下JSON构造实现方案
以下方案同时兼容KSH、BASH运行环境,不需要依赖第三方工具即可完成普通结构、嵌套结构JSON的静态、动态构造,如果环境装有jq也可以配合做格式校验。
核心注意事项
- 字符串类型的键、值必须用双引号包裹,内容里的双引号、反斜杠要提前加反斜杠转义
- 嵌套JSON对象直接作为对应键的值传入即可,不需要额外给对象加双引号
- 动态拼接时要处理好键值对之间的逗号,避免最后一个键值对末尾多出来逗号导致JSON格式非法
静态构造实现
静态构造适合JSON结构完全固定的场景,直接按照JSON语法把内容赋值给Shell变量就行,实现最简单。
#!/bin/ksh # 如果用bash执行,把首行shebang改成#!/bin/bash即可 # 静态构造普通结构JSON normal_json='{ "param1": "value1", "param2": "value2", "param3": "value3" }' echo "=== 普通静态JSON输出 ===" echo "$normal_json" # 静态构造嵌套结构JSON nested_json='{ "param1": "value1", "param2": "value2", "param3": { "param4": "value4", "param5": "value5" } }' echo -e "\n=== 嵌套静态JSON输出 ===" echo "$nested_json"
动态构造实现
动态构造适合键名、键值是脚本运行时才确定的场景,下面给了通用的拼接逻辑,自动处理逗号分隔、字符串转义,支持嵌套结构。
#!/bin/ksh # 兼容BASH环境 # 初始化JSON根容器 json_result='{' # 标记是否为第一个键值对,用来控制逗号的添加逻辑 is_first=1 # 键值对添加函数:参数1是键名,参数2是键值(支持传普通字符串、嵌套JSON对象) add_json_kv() { local key="$1" local val="$2" # 不是第一个键值对的话,先补逗号分隔 if [ $is_first -ne 1 ]; then json_result+=',' fi # 判断值是不是JSON对象(以{开头),对象类型不需要额外包双引号 if [[ "$val" =~ ^\{ ]]; then json_result+="\"$key\":$val" else # 转义普通字符串里的反斜杠和双引号,避免JSON格式错误 escaped_val=$(echo "$val" | sed 's/\\/\\\\/g; s/"/\\"/g') json_result+="\"$key\":\"$escaped_val\"" fi is_first=0 } # ---------- 动态构造普通JSON示例 ---------- # 模拟运行时生成的动态变量 dyn_val1="运行时生成值1" dyn_val2="运行时生成值2" dyn_val3="运行时生成值3" # 重置容器状态 json_result='{' is_first=1 add_json_kv "param1" "$dyn_val1" add_json_kv "param2" "$dyn_val2" add_json_kv "param3" "$dyn_val3" json_result+='}' echo "=== 动态构造普通JSON输出 ===" echo "$json_result" # ---------- 动态构造嵌套JSON示例 ---------- # 先构造内层嵌套对象 inner_obj='{' is_first=1 inner_val4="嵌套值4" inner_val5="嵌套值5" add_json_kv "param4" "$inner_val4" add_json_kv "param5" "$inner_val5" inner_obj+='}' # 构造外层对象,把内层对象作为值传入 json_result='{' is_first=1 add_json_kv "param1" "外层值1" add_json_kv "param2" "外层值2" add_json_kv "param3" "$inner_obj" json_result+='}' echo -e "\n=== 动态构造嵌套JSON输出 ===" echo "$json_result"
补充说明
- 如果运行环境装了
jq,可以把输出结果通过管道传给jq .做自动格式化和合法性校验,比如echo "$json_result" | jq . - 如果需要构造带数组的JSON,只需要在
add_json_kv函数里加一条判断逻辑,识别以[开头的值为数组类型,不额外包裹双引号即可 - 上述脚本没有依赖任何外部工具,在标准KSH、BASH环境下都可以直接运行
内容的提问来源于stack exchange,提问作者anjaneya bt
相关产品推荐
相关产品推荐

