0

我想在“字段”中添加一个数组我该怎么做?

如何添加“字段”数组?

fields=()
for f in NameData/*.json
do
        Name= cat $f | jq -r '.[] | .Name'
        Value= cat $f | jq -r '.[] | .Value'
        
        fields+= #how? 
        '{
            "name" : "'$Name'",
            "value": "'$Value'"
        },'
done

#字段输出

{
    "name" : "Test"
    "value" : "1"
},
{
    "name" : "Test2"
    "value" : "2"
},
...

因为在旁边发帖

function Hi(){
    curl -H "Content-Type: application/json" -X POST -d \
        '{
                    #how to array in fields //while?
            "fields": [
                    {
                        "name": "Test",
                        "value":"'1'",
                    },
                    {
                        "name": "Test2",
                        "value":"'2'",
                    }
                    ...
                ]
        ...
}}

我如何需要提供更多详细信息?你能帮助我吗?谢谢。

我在这里的文件(JSON)就像我正在尝试获取名称和值

xample.json
[
    ...
    {
        "folder" : "nobody",
        "name": "1TS",
        "value": "2",
        ...
    }
]
example2.json
[
    {
        "name": "TST",
        "value": "4.75",
        ...
    }
]
4

2 回答 2

1

Bash 数组只是字符串的集合。可能只是收集键/值对,然后通过将其格式化为 JSON 来完成。

fields=()
for f in NameData/*.json
do
        fields+=$(jq -r '.[] | {name: .name, value: .value}' "$f") 
done

另请注意,您如何需要命令替换来运行命令并将其输出分配给变量,以及我们如何避免无用cat的,只需一次jq调用即可提取两个字段。

但可能更好的解决方案就是jq直接使用。

curl -H "Content-Type: application/json" -X POST -d "$(
    jq -s '{ fields: map({name: .[0].name, value: .[0].value})}' NameData/*.json)"
于 2021-01-25T08:33:37.167 回答
1

看起来您几乎可以在 中完成所有工作jq,如下所示:

fields=$(jq -n '[inputs | .[] | {name, value}]' NameData/example*.json)

说明:-n使其以空输入开始,然后[ ]从每个inputs(之后指定的文件,即NameData/example*.json文件)创建一个新数组,剥离顶层数组并仅选择nameandvalue字段。

请注意,字段名称区分大小写;在您使用的某些地方NameValue,在其他地方namevalue。确保您使用正确的数据大小写。如果您需要将它从大写转换为小写,您可以这样做:

fields=$(jq -n '[inputs | .[] | {name : .Name, value : .Value}]' NameData/example*.json)

要将其与 一起使用curl,您需要正确引用(请参阅此问题)。对大多数 POST 数据进行单引号可能是最简单的,但对于该部分切换到双引号$fields

curl -H "Content-Type: application/json" -X POST -d \
    '{
        "fields": '"$fields"',
    ...
     }'

或者,您可以在以下位置创建整个内容jq

post_data=$(jq -n '{fields : [inputs | .[] | {name : .Name, value : .Value}], ... }' NameData/example*.json)
curl -H "Content-Type: application/json" -X POST -d "$post_data" ...
于 2021-01-25T08:44:50.860 回答