明確に言うと、ここにある他の静的JSONファイルに書き込まれる疑似JSON出力が必要です。したがって、配列や他の項目には含まれず、出力の各エンティティだけが後で欠落しているコンマを取得するだけです。
現在私のクエリは次のとおりです。
.[] | select(.auditId == "categories") |
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
}
}
任意の出力:
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*performance:* 1 (expected 0.8)"
}
}
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*accessibility:* 1 (expected 0.9)"
}
}
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*best-practices:* 0.96 (expected 0.9)"
}
}
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*seo:* 0.64 (expected 0.5)"
}
}
私が本当にしたいとき:
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*performance:* 1 (expected 0.8)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*accessibility:* 1 (expected 0.9)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*best-practices:* 0.96 (expected 0.9)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*seo:* 0.64 (expected 0.5)"
}
},
各項目の後にカンマを記入してください!これは私を狂わせている。別の場所にを追加しようとしましたが、join(", ")
最終出力に何の影響も与えないか、どこに配置したかに応じてコンパイルされません。
これはデータを含むjqplayです。https://jqplay.org/s/xx3F_IWn03g
生の入力JSON:
[
{
"name": "minScore",
"expected": 0.8,
"actual": 1,
"values": [
1,
1,
1
],
"operator": ">=",
"passed": true,
"auditProperty": "performance",
"auditId": "categories",
"level": "error",
"url": "http://localhost:8080/page2"
},
{
"name": "minScore",
"expected": 0.9,
"actual": 1,
"values": [
1,
1,
1
],
"operator": ">=",
"passed": true,
"auditProperty": "accessibility",
"auditId": "categories",
"level": "error",
"url": "http://localhost:8080/page2"
},
{
"name": "minScore",
"expected": 0.9,
"actual": 0.96,
"values": [
0.93,
0.96,
0.96
],
"operator": ">=",
"passed": true,
"auditProperty": "best-practices",
"auditId": "categories",
"level": "error",
"url": "http://localhost:8080/page2"
},
{
"name": "minScore",
"expected": 0.5,
"actual": 0.64,
"values": [
0.64,
0.64,
0.64
],
"operator": ">=",
"passed": true,
"auditProperty": "seo",
"auditId": "categories",
"level": "error",
"url": "http://localhost:8080/page2"
}
]
答え1
欲しいと思う調整auditId
stringに設定された項目categories
。あなたがやっていることはタブレット最上位配列のこれらの要素を変更します。これは配列ではなくオブジェクトのセットを提供します。
|
配列から要素を抽出するために使用する代わりに、次のようにします。|=
その要素を変更します。結果の配列を別のファイルのJSON構造に正しく挿入する方法については、この回答の最後を参照してください。
だから、使用
.[] |= (
select(.auditId == "categories") |
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
}
}
)
またはまったく使用しない.[]
でください。map()
最上位配列の各要素の式:
map(
select(.auditId == "categories") |
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
}
}
)
これらの式は、次の要素配列を提供します。
[
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*performance:* 1 (expected 0.8)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*accessibility:* 1 (expected 0.9)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*best-practices:* 0.96 (expected 0.9)"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*seo:* 0.64 (expected 0.5)"
}
}
]
array
別のファイルにすでに存在する配列にこの配列を追加するには、次のようにします。の最上位レベルにキーがあり、otherfile
入力がにあるとしますinputfile
。キーがまだ存在しない場合、キーが生成されます。 ):
jq '.array += ( input |
map(
select(.auditId == "categories") |
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
}
}
)
)' otherfile inputfile
実行すると、input
コマンドラインの2番目のファイルから配列を読み込みます。
既存のキー値を追加せずに既存のキー値を置き換えるには、+=
justに変更します。=
array
答え2
はい、これが[]
イテレータがすることです。各イテレータはJSONファイルをインポートします。配列を取得するには、式全体をまとめて[...]
配列を作成するか、その要素を繰り返すのではなく、map()
入力配列を変更するために使用できます。[]
$ echo '[1,2,3,4]' | jq '.[]|select(.<3)'
1
2
$ echo '[1,2,3,4]' | jq '[.[]|select(.<3)]'
[
1,
2
]
$ echo '[1,2,3,4]' | jq 'map(select(.<3))'
[
1,
2
]
含めずにコンマ区切りの要素を使用して配列[
に]
すると、jsonが無効になります。ただし、必要に応じてパイプを使用してsed '1d;$d'
最初の行と最後の行を削除できます。