json - 查询条件

时间:2018-02-07 14:20:46

标签: json jq

我跟随json:

for i in range(len(y_test)):
    if result[i] == y_test[i]:
        print("CORRECT: ", X_test[i])
    else
        print("INCORRECT: ", X_test[i])

我可以过滤以下内容:

{
  "id": "1",
  "name": "profile1",
  "userId": "0",
  "groupId": "3",
  "attributes": [
    {
      "id": "104",
      "name": "Enable",
      "value": "1"
    },
    {
      "id": "105",
      "name": "TargetNode",
      "value": "system1"
    },
    {
      "id": "106",
      "name": "Timeout",
      "value": "30"
    }
  ],
  "xconns": [
    {
      "id": "1",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    },
    {
      "id": "1",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    },
    {
      "id": "1",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    }
  ]
}
{
  "id": "2",
  "name": "profile2",
  "userId": "7",
  "groupId": "0",
  "attributes": [
    {
      "id": "104",
      "name": "Enable",
      "value": "1"
    },
    {
      "id": "105",
      "name": "TargetNode",
      "value": "system2"
    },
    {
      "id": "106",
      "name": "Timeout",
      "value": "30"
    }
  ],
  "xconns": [
    {
      "id": "2",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    },
    {
      "id": "2",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    },
    {
      "id": "2",
      "locked": false,
      "attributeList": [
        {
          "id": "101",
          "name": "Lgrp",
          "value": "1"
        },
        {
          "id": "102",
          "name": "IsRem",
          "value": "1"
        },
        {
          "id": "103",
          "name": "Media",
          "value": "1"
        }
      ]
    }
  ]
}

我还需要添加TargetNode的值:

$ jq -r 'select([.attributes[] | .name == "TargetNode" ] | any ) | [{userId, groupId, id, name}] | .[] | if (.userId == "0") then del(.userId) else . end | if (.groupId == "0") then del(.groupId) else . end | to_entries | map("\(.key | ascii_upcase):\(.value)") | @tsv' file.json
GROUPID:3       ID:1    NAME:profile1
USERID:7        ID:2    NAME:profile2

有没有办法将其加入 [{userId,groupId,id,name,TargetNode}] 获取TargetNode的值而不是null?

GROUPID:3 ID:1 NAME:profile1 TARGETNODE:null

USERID:7 ID:2 NAME:profile2 TARGETNODE:null

更新: RomanPerekhrest提供的解决方案几乎没问题,但有一个问题,因为实际中的json文件要大得多,主要部分中有更多的属性,例如:

GROUPID:3       ID:1    NAME:profile1    TARGETNODE:system1
USERID:7        ID:2    NAME:profile2    TARGETNODE:system2

令人感到愤怒的是,RomanPerekhrest的jq过滤器返回太多...... 如何摆脱它们?

{
  "id": "1",
  "name": "profile1",
  "userId": "0",
  "groupId": "3",
  "attrib101": "A",
  "attrib102": "B",
  "attributes": [
...
...

1 个答案:

答案 0 :(得分:2)

jq 解决方案:

jq -r '.attributes |= map(select(.name == "TargetNode")) 
       | if (.attributes | length != 0) then .targetNode = .attributes[0].value else . end 
       | if (.userId == "0") then del(.userId) else . end 
       | if (.groupId == "0") then del(.groupId) else . end 
       | del(.attributes, .xconns) | to_entries 
       | map("\(.key | ascii_upcase):\(.value)") | @tsv' file.json

如果"name": "TargetNode"对不存在的对象 - TARGETNODE将不会添加到结果结构中

输出:

ID:1    NAME:profile1   GROUPID:3   TARGETNODE:system1
ID:2    NAME:profile2   USERID:7    TARGETNODE:system2