将对象转换为键值对数组

恶魔大师

我有一个文件,其中每一行都是一个json(未格式化),如下所示:

{
  "callID": "xxxxxxxxxxxxxx",
  "authType": "xxxxxxxxxxxxxx",
  "timestamp": "xxxxxxxxxxxxxx",
  "errCode": "0",
  "errMessage": "xxxxxxxxxxxxxx",
  "endpoint": "xxxxxxxxxxxxxx",
  "userKey": "xxxxxxxxxxxxxx",
  "httpReq": {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
  },
  "ip": "xxxxxxxxxxxxxx",
  "params": {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
  },
  "uid": "xxxxxxxxxxxxxx",
  "apikey": "xxxxxxxxxxxxxx",
  "userAgent": {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
  },
  "userKeyDetails": {
    "name": "xxxxxxxxxxxxxx"
  }
}

我需要执行转换,其中每一个对象(httpReqparamsuserAgentuserKeyDetails)需要被转换为对象的阵列,其中keyvalue性质。每个键不是强制性的,单个json可能没有所有给定的键。

这是该结构的部分输出:

{
  "httpReq": [
    {
      "key": "key1",
      "value": "value1"
    },
    {
      "key": "key2",
      "value": "value2"
    }
  ]
}

使用jq命令行,我了解to_entries运算符是我要寻找的运算符,因此我创建了此命令

cat test.json | jq -c '.userAgent = (.userAgent | to_entries) | .userKeyDetails = (.userKeyDetails | to_entries) | .params = (.params | to_entries) | .httpReq= (.
httpReq | to_entries)' > out.json

它可以工作,但是在缺少给定键之一的行上失败,并显示以下错误:

jq: error (at <stdin>:2): null (null) has no keys
jq: error (at <stdin>:3): null (null) has no keys
jq: error (at <stdin>:4): null (null) has no keys
jq: error (at <stdin>:5): null (null) has no keys

因此,我需要一个选择器,该选择器可以处理缺少键的可能性,可以直接通过jq选择器获得它吗?

oguz ismail

如果要对所有对象执行转换,则无需指定每个对象;以下应该可以解决问题。

map_values(if type == "object" then to_entries else . end)

REPL演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章