簡體   English   中英

JSON列表(不是對象)到Bash數組?

[英]JSON list (not object) to Bash array?

我有一個JSON列表(包含項列表的鍵值對的值):

[ "john", "boris", "joe", "frank" ]

我如何將其轉換為bash數組,以便可以對其進行迭代?

簡單案例:無換行符的字符串

一種簡單的方法是使用jq將列表轉換為每行一行,然后將其讀入腳本中:

json='[ "john", "boris", "joe", "frank" ]'
readarray -t your_array < <(jq -r '.[]' <<<"$json")
declare -p your_array

...正確發出:

declare -a your_array=([0]="john" [1]="boris" [2]="joe" [3]="frank")

棘手的案例:帶換行符的字符串

有時,您需要讀取可能包含換行符的字符串(或者想要避免由於將惡意或格式錯誤的數據讀入錯誤的字段而導致的安全風險)。 為避免這種情況,您可以在數據之間使用NUL分隔符(並刪除其中包含的所有NUL值):

json='[ "john\ndoe", "marco\nquent", "malicious\u0000data" ]'

array=( )
while IFS= read -r -d '' item; do
  array+=( "$item" )
done < <(jq -j '.[] | ((. | sub("\u0000"; "<NUL>")) + "\u0000")' <<<"$json")

declare -p array

...正確發出:

declare -a array=([0]=$'john\ndoe' [1]=$'marco\nquent' [2]="malicious<NUL>data")

...並且printf '<%s>\\n\\n' "${array[@]}"正確發出:

<john
doe>

<marco
quent>

<malicious<NUL>data>

(請注意,非常新的bash具有readarray -0 ,可以避免需要上面給出的while IFS= read -r -d ''循環,但這還不常見。還要注意,您可以使用該循環直接迭代來自jq內容,首先避免了將內容存儲在數組中的問題;請參閱BashFAQ#1 )。

暫無
暫無

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

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