2017-04-05 74 views
1

我想用JQ命令行變換FORMDATA JSON對象轉換成字符串像id=johndoe&password=secret&foo=bar猛砸JQ FORMDATA對象編碼參數字符串

{ 
     "name": "example", 
     "auth_url": "http://example.com/login", 
     "form_data": { 
      "id": "johndoe", 
      "password": "secret", 
      "foo": "bar" 
     } 
} 

到目前爲止,我想出了這個功能,它的工作原理,但看起來不夠優雅或優化

function form_data_to_encoded() { 
    local obj=$1 
    form_data_keys=$(echo $obj | jq '.form_data | keys') 
    length=$(echo $form_data_keys | jq 'length') 
    encoded="" 
    for ((i=0; i<$length; i++)); do 
     key=$(echo "$form_data_keys" | jq --raw-output ".[$i]") 
     value=$(echo "$obj" | jq --raw-output ".form_data.$key") 
     encoded="$encoded$key=$value" 
     if ((((i+1)) < "$length")); then 
      encoded="$encoded&" 
     fi 
    done 
    echo "$encoded" 
} 

有沒有一種方法可以創建使用只有一個(或更少)JQ過濾器來實現? 感謝您的幫助或洞察力:)

回答

3

您可以使用格式字符串用繩子插值一起逃離的地圖(在JQ手動兩節的標題),其次是減少:

jq -r ' 
    .form_data | 
    to_entries | 
    map(@uri "\(.key)=\(.value)") | 
    reduce .[1:][] as $i (.[0]; .+"&"+$i) 
'