我正在尝试读取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},")
型
1条答案
按热度按时间dfuffjeb1#
首先,使用
bash
中的常规行编辑工具解析JSON非常棘手!假设你在一行中得到了许多项(k=key/v=value对)(例如{ "Key": "k1", "Value": "v1" }, {"Key": "k2", "Value": "v2" }
);你可以这样做(使用$line_with_items
中的示例数据):字符串
您将获得:
型
但是我不会像你描述的那样设置你的代码。你已经在里面使用Python了,你可以很容易地用Python解析JSON,然后把它以任何你想要的方式提供给你的bash脚本,这样解析数据就容易多了。(或者用Python做所有事情!)
你也可以使用jq,这是一个很酷的工具来解析bash中的JSON!那你就不需要Python了