簡體   English   中英

使用bash返回json對象中的特定項目

[英]return specific items in json object using bash

我試圖對多個對象進行json響應(來自curl命令和安裝在我的linux comp上的jq),並使用for循環編輯每個對象。 問題是我不明白如何將每個{}轉換為單獨的對象。 例如,我的json響應是:

{
  "Name": "testuser1",
  "Username": "testuser1",
  "Url": "www.test1.com"
}
{
  "Name": "testuser2",
  "Username": "testuser2",
  "Url": "www.test2.com"
}

理想情況下,我想用數字來指代每個人。 例如,“ echo $ item | jq'.Name [0]'”

{
  "Name": "testuser1",
  "Username": "testuser1",
  "Url": "www.test1.com"
}

當我運行上面的命令時,出現以下錯誤。

jq: error (at <stdin>:1): Cannot index string with number

我想為每個對象運行一個forloop。

您需要做兩件事:一,使用-s選項,以便每個單獨的對象成為單個數組的元素。 第二,您嘗試索引Name ,而不是訪問數組元素的Name屬性。

$ jq -sr '.[].Name' tmp.json
testuser1
testuser2

如果要引用流中的特定元素,則可以:

$ jq -sr '.[1].Name' tmp.json
testuser2

這樣(並假設您的名字中沒有一個包含換行符),一個適當的循環將看起來像

while IFS= read -r name; do
    ...
done < <(jq -sr '.[].Name' tmp.json)

要僅選擇名字,您需要嘗試進入Name元素之前進行索引:

jq -rs '.[0].Name'

相比之下,對於循環而言, @ chepner的答案給出while read方法確實是合適的。

jq是面向流的,因此,如果要對每個對象執行某些操作,則在jq中定義該操作可能就足夠了,讓jq毫不費力地處理流。

如果由於某種原因您需要流中每個項目的索引,那么如果jq有inputs (與jq 1.5一樣),則可以避免使用-s選項。 (避免使用-s選項可以節省內存。)

以下假設您的jq確實有inputs 索引是從0開始的; 並使用-n選項調用該jq。

產生索引

foreach inputs as $input (-1; .+1; [., $input])

這將產生[INDEX,ITEM]數組流。 然后,您可以使用jq的管道運算符( | )進一步添加jq過濾器。

從JSON實體流中選擇第i個項目。

為了說明調用jq的合適方法,讓我們假設JSON實體流來自curl COMMAND ,並且我們想要第二項(即索引為1)。

調用

curl COMMAND | jq --argjson i 1 -n -f program.jq

(請注意-n命令行選項!)

program.jq

def get($i):
  label $done
  | foreach inputs as $input (-1; .+1;
      if $i == . then $input, break $done else empty end);

get($i)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM