如何在没有外部库的情况下在bash中迭代JSON对象

62lalag4  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(114)

我正在尝试读取JSON文件并对每个对象执行命令。JSON格式如下:

[
        {
            "table": "table_name",
            "items": [
                {
                    "Key": "k1",
                    "Value": "v1"
                },
                {
                    "Key": "k2",
                    "Value": "v2"
                }
            ]
        }, {...}
    ]

字符串
目前,我有一个bash脚本,它读取JSON文件,并将其内容与表名沿着发送给一个python脚本,然后返回相应的项。所以现在我有一个变量items,它保存对象,例如。{ "Key": "k1", "Value": "v1" }, {"Key": "k2", "Value": "v2" }.如何拆分字符串,以便分别获取每个对象。
循环

for item in $items; do
        echo "Item: $item"
    done


应打印输出

Item: { "Key": "k1", "Value": "v1" }
Item: { "Key": "k2", "Value": "v2" }


总的来说,脚本将包含2个循环--一个循环遍历表,另一个循环遍历json对象并将它们用作参数。我该如何实现这一点?
我现在的代码看起来像这样:bash:

tables=$(echo "$data" | grep -o '"table": *"[^"]*' | grep -o '"[^"]*$' | awk -F '"' '{print $2}')

for table in $tables; do
    items=$(echo "$data" | python parse_json.py "$table" "$data")
    
    echo "$table ${items[@]}"
    IFS=',' read -r -a json_objects <<< "${items%,}"
done


python:

import sys, json

table_name = sys.argv[1]
data = json.loads(sys.argv[2])

# Extract items for the current table
items = [item for entry in data if entry['table'] == table_name for item in entry['items']]

# Output items as JSON strings
#print([f"{item}," if i != len(items) - 1 else item for i, item in enumerate(items)])
for i, item in enumerate(items):
    print(item) if i == len(items)-1 else print(f"{item},")

dfuffjeb

dfuffjeb1#

首先,使用bash中的常规行编辑工具解析JSON非常棘手!假设你在一行中得到了许多项(k=key/v=value对)(例如{ "Key": "k1", "Value": "v1" }, {"Key": "k2", "Value": "v2" });你可以这样做(使用$line_with_items中的示例数据):

_get_item() {
   # from "X": "Y" get: "Y"
   ITEM="$1"
   IFSorg=$IFS
   IFS=:
   set -- $ITEM
   VALUE="$2"

   # from "Y" get: Y
   IFS='"'
   set -- $VALUE
   VALUE="$2"
   IFS=$IFSorg
   echo "$VALUE"
}

line_with_items='{ "Key": "k1", "Value": "v1" }, {"Key": "k2", "Value": "v2" }'
items=$(echo $line_with_items|sed 's/,/;/g;s/[{}]//g')

IFSorg=$IFS
IFS=';'
set -- $items
while [ $# -gt 0 ]
do
   KEY="$(_get_item \"$1\")"
   VAL="$(_get_item \"$2\")"
   shift; shift
   echo "Key=$KEY Value=$VAL"
done
IFS=$IFSorg

字符串
您将获得:

Key=k1 Value=v1
Key=k2 Value=v2


但是我不会像你描述的那样设置你的代码。你已经在里面使用Python了,你可以很容易地用Python解析JSON,然后把它以任何你想要的方式提供给你的bash脚本,这样解析数据就容易多了。(或者用Python做所有事情!)
你也可以使用jq,这是一个很酷的工具来解析bash中的JSON!那你就不需要Python了

相关问题