【问题标题】:Object Construction with nested m:n structure in jqjq中具有嵌套m:n结构的对象构造
【发布时间】:2021-04-22 06:38:29
【问题描述】:

我有这个 json

 {
  "objectEntries": [
    {
      "objectType": {
        "name": "Test"
      },
      "attributes": [
        {
          "id": 16,
          "objectTypeAttributeId": 8,
          "objectAttributeValues": [
            {
              "referencedObject": {
                "id": 17,
                "label": "TestTest",
                "attributes": [
                  {
                    "id": 20,
                    "objectTypeAttributeId": 11,
                    "objectAttributeValues": [
                      {
                        "value": "bli"
                      }
                    ],
                    "objectId": 12
                  },
                  {
                    "id": 21,
                    "objectTypeAttributeId": 13,
                    "objectAttributeValues": [
                      {
                        "value": "blo"
                      }
                    ],
                    "objectId": 14
                  },
                  {
                    "id": 22,
                    "objectTypeAttributeId": 15,
                    "objectAttributeValues": [
                     {
                      "referencedObject": {
                        "id": 30,
                        "label": "TestTest",
                        "attributes": [
                          {
                            "id": 35,
                            "objectTypeAttributeId": 36,
                            "objectAttributeValues": [
                              {
                                "value": "bli"
                              }
                            ],
                            "objectId": 37
                          },
                          {
                            "id": 38,
                            "objectTypeAttributeId": 39,
                            "objectAttributeValues": [
                              {
                                "value": "blo"
                              }
                            ],
                            "objectId": 40
                          }
                        ]
                      }
                    }
                  ],
                    "objectId": 16
                  }
                ]
              }
            }
          ]
        },
        {
          "id": 16,
          "objectTypeAttributeId": 8,
          "objectAttributeValues": [
            {
              "referencedObject": {
                "id": 17,
                "label": "TestTest",
                "attributes": [
                  {
                    "id": 20,
                    "objectTypeAttributeId": 11,
                    "objectAttributeValues": [
                      {
                        "value": "bli"
                      }
                    ],
                    "objectId": 12
                  },
                  {
                    "id": 21,
                    "objectTypeAttributeId": 13,
                    "objectAttributeValues": [
                      {
                        "value": "blo"
                      }
                    ],
                    "objectId": 14
                  },
                  {
                    "id": 22,
                    "objectTypeAttributeId": 15,
                    "objectAttributeValues": [
                     {
                      "referencedObject": {
                        "id": 30,
                        "label": "TestTest",
                        "attributes": [
                          {
                            "id": 35,
                            "objectTypeAttributeId": 36,
                            "objectAttributeValues": [
                              {
                                "value": "xxx"
                              }
                            ],
                            "objectId": 37
                          },
                          {
                            "id": 38,
                            "objectTypeAttributeId": 39,
                            "objectAttributeValues": [
                              {
                                "value": "yyy"
                              }
                            ],
                            "objectId": 40
                          }
                        ]
                      }
                    }
                  ],
                    "objectId": 16
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  ]
}

我想要这个结果。

{
  "name": "Test",
  "attribute36": "bli",
  "attribute39": "blo"
}
{
  "name": "Test",
  "attribute36": "xxx",
  "attribute39": "yyy"
}

但我得到的是这个

{
  "name": "Test",
  "attribute36": "bli",
  "attribute39": "blo"
}
{
  "name": "Test",
  "attribute36": "bli",
  "attribute39": "yyy"
}
{
  "name": "Test",
  "attribute36": "xxx",
  "attribute39": "blo"
}
{
  "name": "Test",
  "attribute36": "xxx",
  "attribute39": "yyy"
}

我想出的 jq 查询

jq '.objectEntries[] | {"name": .objectType.name, "attribute36": .attributes | .[] | select(.objectTypeAttributeId==8) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==15) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==36) |  .objectAttributeValues | .[] | .value, "attribute39": .attributes | .[] | select(.objectTypeAttributeId==8) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==15) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==39) |  .objectAttributeValues | .[] | .value}' stackoverflow.json

你也可以在 jqplay https://jqplay.org/s/NjqEy7wvQE看到这个问题

目标是将不同 jsonpath 深度上的某些字段提取到一个新的平面 json 对象中,每个顶层 json 对象,其中顶层是 objectEntries[] 下的对象

【问题讨论】:

  • 发布您的要求,您要达到什么目的?即你想要的结果背后的逻辑
  • 为什么只有 36、39?
  • 对象构造逻辑还不清楚
  • name、attribute36、attribute39 是我对 objectEntries 中的对象数组感兴趣的值。我需要提取它们才能从这 3 个键:值对中创建一个 csv。 attributeId 是唯一的,我在嵌套对象中通过 attributeId 选择我感兴趣的值

标签: jq


【解决方案1】:

看Q中的jq查询,我们可以定义两个有用的函数:

def attributes:
  [ .attributes[]
    | select(.objectTypeAttributeId==8)
    | .objectAttributeValues[].referencedObject.attributes[]
    | select(.objectTypeAttributeId==15)
    | .objectAttributeValues[].referencedObject.attributes[] ] ;


def to_o:
   { ("attribute" + (.objectTypeAttributeId|tostring)): first(.objectAttributeValues[].value)};

我们看到了

.objectEntries[] | attributes[] | to_o

产量:

{"attribute36":"bli"}
{"attribute39":"blo"}
{"attribute36":"xxx"}
{"attribute39":"yyy"}

这是原始问题变得有点难以理解的地方。我将假设其意图是将这些对象组合在一起而不会丢失信息并且不引入数组。

无论如何,以下过滤器确实会产生所需的结果:

.objectEntries[]
| .objectType.name as $name
| foreach ((attributes[] | to_o), null ) as $o ({};
     if $o == null then .emit = .object
     elif .object|has($o|keys_unsorted[0])
     then .emit=.object | .object=$o
     else .emit=null | .object += $o
     end;
     select(.emit) | .emit)
| {$name} + .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2023-03-20
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多