如何在jq中将JSON对象转换为key = value格式?

时间:2014-08-19 07:39:08

标签: json bash jq

在jq中,如何将JSON转换为key=value的字符串?

自:

{
    "var": 1,
    "foo": "bar",
    "x": "test"
}

要:

var=1
foo=bar
x=test

4 个答案:

答案 0 :(得分:45)

你可以尝试:

jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json

这是一个演示:

$ cat test.json
{
    "var": 1,
    "foo": "bar",
    "x": "test"
}
$ jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json
foo=bar
var=1
x=test

答案 1 :(得分:3)

  

我有什么方法可以递归地做到这一点?

这是一个可能做你想做的功能:

# Denote the input of recursively_reduce(f) by $in.
# Let f be a filter such that for any object o, (o|f) is an array.
# If $in is an object, then return $in|f;
# if $in is a scalar, then return [];
# otherwise, collect the results of applying recursively_reduce(f)
# to each item in $in.
def recursively_reduce(f):
  if type == "object" then f
  elif type == "array" then map( recursively_reduce(f) ) | add
  else []
  end;

示例:emit key = value pairs

def kv: to_entries | map("\(.key)=\(.value)");


[ {"a":1}, [[{"b":2, "c": 3}]] ] | recursively_reduce(kv)
#=> ["a=1","b=2","c=3"]

更新:在jq 1.5发布后,walk / 1被添加为jq定义的内置。它可以与上面定义的kv一起使用,例如如下:

 walk(if type == "object" then kv else . end) 

通过上述输入,结果将是:

[[" = 1"],[[[" B = 2"" C = 3"]]]]

To" flatten"输出,flatten / 0可以使用。这是一个完整的例子:

jq -cr 'def kv: to_entries | map("\(.key)=\(.value)");
        walk(if type == "object" then kv else . end) | flatten[]'

输入:

[ {"a":1}, [[{"b":2, "c": 3}]] ]

输出:

a=1
b=2
c=3

答案 2 :(得分:1)

在没有jq的情况下,我能够使用grepsed导出json中的每个项目,但这仅在具有键/值对的简单情况下有效

for keyval in $(grep -E '": [^\{]' fileName.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
    echo "$keyval"
done

这是示例响应:

❯ for keyval in $(grep -E '": [^\{]' config.dev.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
    echo "$keyval"       
done
"env"="dev"
"memory"=128
"role"=""
"region"="us-east-1"

答案 3 :(得分:0)

顺便说一句,以@aioobe的出色答案为基础。如果您需要按键全部为大写字母,则可以使用ascii_upcase通过修改示例来实现:

jq -r 'to_entries|map("\(.key|ascii_upcase)=\(.value|tostring)")|.[]'

示例

我的情况与您相似,但是在创建用于访问AWS的环境变量时想大写所有键。

$ okta-credential_process arn:aws:iam::1234567890123:role/myRole | \
     jq -r 'to_entries|map("\(.key|ascii_upcase)=\(.value|tostring)")|.[]'
EXPIRATION=2019-08-30T16:46:55.307014Z
VERSION=1
SESSIONTOKEN=ABcdEFghIJ....
ACCESSKEYID=ABCDEFGHIJ.....
SECRETACCESSKEY=AbCdEfGhI.....

参考文献