转换json以添加数组对象

时间:2019-06-21 10:32:07

标签: json jq key-value

我需要通过添加其他对象来变换数组-

我有

"user_id":"testuser"
"auth_token":"abcd"

我需要:

"key":"user_id"
"value":"testuser"
"key":"auth_token"
"value":"abcd"

我一直在使用jq,但不知道该怎么做。我是否需要先将其转换为multi-dimensional数组?

我尝试了多个jq查询,但是找不到最合适的

当我尝试使用jq时,我会得到

  

jq:错误:语法错误,意外的$ end,期望在第1行的QQSTRING_TEXT或QQSTRING_INTERP_START或QQSTRING_END(Unix shell引用问题?)

3 个答案:

答案 0 :(得分:1)

您可以为此使用 to_entries 过滤器。

Here is jqplay example

答案 1 :(得分:1)

您的输入不是json,它只是一堆可以视为键/值对的东西。假设您的json输入实际上看起来像这样:

{
    "user_id": "testuser",
    "auth_token": "abcd"
}

您可以使用to_entries获取键/值对对象数组。

$ jq 'to_entries' input.json
[
    {
        "key": "user_id",
        "value": "testuser"
    },
    {
        "key": "auth_token",
        "value": "abcd"
    }
]

如果另一方面您的输入实际上是该输入,则需要将其转换为可以处理的格式。幸运的是,您可以将其读取为原始字符串,并可以使用正则表达式或基本的字符串操作进行解析。

$ jq -Rn '[inputs|capture("\"(?<key>[^\"]+)\":\"(?<value>[^\"]*)\"")]' input.txt
$ jq -Rn '[inputs|split(":")|map(fromjson)|{key:.[0],value:.[1]}]' input.txt

答案 2 :(得分:1)

key:value行到JSON的严格转换。

如果key:value规范是有效的JSON,除了 缺少标点符号(打开和闭合大括号等),则以下示例说明了将这些key:value对转换为单个有效JSON对象的简单且非常可靠的方法:

cat <<EOF | jq -nc -R '["{" + inputs + "}" | fromjson] | add' 
"user_id": "testuser"
"auth_token" : "abcd"
EOF

输出

{
  "user_id": "testuser",
  "auth_token": "abcd"
}