2017-09-14 57 views
1

私は根本的に間違ったことをしていますが、何が見えないのでしょうか?jqを使用してオブジェクトの入れ子になったJSONを配列に変換します。

私は、次の子がこれまでに以下のクエリを使用しますが、配列「 entries」私はJQ機能を経由してのbashでアクセス配列にこれらを変換したい

{ 
    "profile": { 
     "name": "TesterRun1", 
     "download": { 
      "entries": [{ 
        "ENTRY_A": "testserver1_place_com", 
        "store": "A", 
        "type": "direct" 
       }, 
       { 
        "ENTRY_B": "testserver2_anotherplace_com", 
        "store": "B", 
        "type": "bypass" 
       }, 
       { 
        "ENTRY_B": "testserver2_anotherplace_com", 
        "store": "A", 
        "type": "bypass" 
       } 
      ] 
     } 
    } 
} 

to_entries」の中に含まれるオブジェクトいる

何もない!

jq 'to_entries|.[]|.profile.download.entries|select(.store=="A")|.[]' 

あなたは何もJQプレイに返されないことをここで見ることができます - enter link description here

私の正気を救う助けてください、私は間違って

+0

'bashにアクセスできるものがありませんto_entries'。アイデアがどこにあるのかわからない。 –

+0

それ以外に、実際の出力は何ですか? –

答えて

0

to_entriesを何をやっているにJQ結果を暴露して行うには全く何もしていますbash。むしろ、JSONオブジェクトの各エントリを取り、{"key": key, "value": value}のペアを生成します。

これはです。は、任意のキーを識別して抽出する場合に便利です。たとえば:STDINであなたの入力が与えられたとき...、(空白の変更なしに、単一の行にあるものの)

#!/usr/bin/env bash 

jq_script=' 
.profile.download.entries[] 
| select(.store == "A") 
| to_entries[] 
| select(.key != "store") 
| select(.key != "type") 
| [.key, .value] 
| @tsv 
' 

declare -A array=() 
while IFS=$'\t' read -r key value; do 
    array[$key]=$value 
done < <(jq -r "$jq_script") 

# print array output 
declare -p array 

放出します:

declare -A array=([ENTRY_A]="testserver1_place_com" 
        [ENTRY_B]="testserver2_anotherplace_com") 

...私が想定しているは、問題の説明が不足しているため、実際に欲しいものです。

+0

こんにちはチャールズ、希望の出力の例を与えていないことをお詫びします。私が思うに、私が抽出しようとしているレコードは、bashでループする前に別のオブジェクトに配置する必要はありません。夜間の睡眠の後、データを配列に直接渡すという明確な例があれば、はるかに明確になります。これは私が必要とするものです。あなたの非常に迅速で明確な対応に感謝します。 – Tav

0

jqの出力を別々の列配列にキャプチャする、若干異なるアプローチ(いくつかのクリーンアップされたデータを使用)です。

#!/bin/bash 
data='{ 
    "profile": { 
    "name": "TesterRun1", 
    "download": { 
     "entries": [ 
     { 
      "entry": "testserver1_place_com", 
      "store": "A", 
      "type": "direct" 
     }, 
     { 
      "entry": "testserver2_anotherplace_com", 
      "store": "B", 
      "type": "bypass" 
     }, 
     { 
      "entry": "testserver2_anotherplace_com", 
      "store": "A", 
      "type": "bypass" 
     } 
     ] 
    } 
    } 
}' 
filter=' 
     .profile.download.entries[] 
     | select(.store == "A") 
     | .entry, .store, .type 
'  
declare -a ENTRY 
declare -a STORE 
declare -a TYPE 
i=0 
while read -r entry; read -r store; read -r type; do 
    ENTRY[$i]="$entry" 
    STORE[$i]="$store" 
    TYPE[$i]="$type" 
    i=$((i + 1)) 
done < <(jq -Mr "$filter" <<< "$data") 
declare -p ENTRY STORE TYPE 

出力

declare -a ENTRY='([0]="testserver1_place_com" [1]="testserver2_anotherplace_com")' 
declare -a STORE='([0]="A" [1]="A")' 
declare -a TYPE='([0]="direct" [1]="bypass")' 
関連する問題