最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

json - Filtering key and specific value - Stack Overflow

programmeradmin0浏览0评论

Using the following json document :

{
  "connections": {
    "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": {
      "address": "",
      "at": "0001-01-01T00:00:00Z",
      "clientVersion": "",
      "connected": false,
      "crypto": "",
      "inBytesTotal": 0,
      "isLocal": false,
      "outBytesTotal": 0,
      "paused": false
    },
    "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": {
      "address": "",
      "at": "0001-01-01T00:00:00Z",
      "clientVersion": "",
      "connected": false,
      "crypto": "",
      "inBytesTotal": 0,
      "isLocal": false,
      "outBytesTotal": 0,
      "paused": false
    }
  }
}

I would like to filter it using jq get a "connection.(value?)": "connection.(value?).connected" report using only command-line tools:

{
   "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": false,
   "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": false
}

The best results I catched is below. I can't find a better way to iterate twice those values correctly and to get rid of "id" & "status" keys.

$ jq '{ id: .connections | keys[] , status : .connections[].connected }' < demo.json 
{
  "id": "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP",
  "status": false
}
{
  "id": "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP",
  "status": false
}
{
  "id": "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG",
  "status": false
}
{
  "id": "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG",
  "status": false
}

I think I have to figure what is the (value?) thing and how to deal with.

Thank you

Using the following json document :

{
  "connections": {
    "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": {
      "address": "",
      "at": "0001-01-01T00:00:00Z",
      "clientVersion": "",
      "connected": false,
      "crypto": "",
      "inBytesTotal": 0,
      "isLocal": false,
      "outBytesTotal": 0,
      "paused": false
    },
    "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": {
      "address": "",
      "at": "0001-01-01T00:00:00Z",
      "clientVersion": "",
      "connected": false,
      "crypto": "",
      "inBytesTotal": 0,
      "isLocal": false,
      "outBytesTotal": 0,
      "paused": false
    }
  }
}

I would like to filter it using jq get a "connection.(value?)": "connection.(value?).connected" report using only command-line tools:

{
   "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": false,
   "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": false
}

The best results I catched is below. I can't find a better way to iterate twice those values correctly and to get rid of "id" & "status" keys.

$ jq '{ id: .connections | keys[] , status : .connections[].connected }' < demo.json 
{
  "id": "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP",
  "status": false
}
{
  "id": "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP",
  "status": false
}
{
  "id": "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG",
  "status": false
}
{
  "id": "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG",
  "status": false
}

I think I have to figure what is the (value?) thing and how to deal with.

Thank you

Share Improve this question edited Feb 6 at 14:32 DarkBee 15.6k8 gold badges70 silver badges115 bronze badges asked Feb 6 at 14:30 JBDJBD 333 bronze badges 1
  • Try jq '.connections | .[] |= .connected' demo.json. Demo – pmf Commented Feb 6 at 16:14
Add a comment  | 

3 Answers 3

Reset to default 1

Use with_entries to update the .value of the object to the value of .connected:

.connections | with_entries(.value = .value.connected)

JqPlay Demo

{
  "7MXYADN-WDXFLSC-3JBG57R-JHZXXYP-ZROJDED-YFQYNCL-WTHPSOQ-KHOLXAP": false,
  "QYMGEAI-FXM6I6W-FQ574FL-XABEKPV-VK5M42T-AQ7TERD-VVEJ2F7-SFSRYQG": false
}

You can use map_values :

jq '.connections | map_values(.connected)' input.json

Here's how to tweak your original code (incase you were wondering):

# your original code
jq '{ id: .connections | keys[], status: .connections[].connected }'

# updated code
jq '[{ key: .connections | keys[], value: .connections[].connected }] | from_entries'
  • [1] Wrap in array, [2] change {id,status} to {key,value}, [3] convert using from_entries

    jq -n '[{"key":"a","value":1},{"key":"b","value":2}] | from_entries'
    will output => {"a": 1, "b": 2}

发布评论

评论列表(0)

  1. 暂无评论