当前位置: 首页 > 知识库问答 >
问题:

JOLT移位转换:按属性的内部值(不是名称)过滤

晋承运
2023-03-14

我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图通过属性的内部值进行过滤。

我的目标是获得一个只包含类型名为' xx '的项目的数组。

这是我的输入和预期输出:

输入:

{
  "id": 11,
  "item": [
    {
      "id": "11_1",
      "action": "add",
      "type": {
        "id": "11_1_xx",
        "typeName": "xx"
      },
      "item": [
        {
          "id": "11_1_1",
          "action": "add",
          "type": {
            "id": "11_1_1_zz",
            "typeName": "zz"
          },
          "item": [
            {
              "id": "11_1_1_1",
              "action": "add",
              "type": {
                "id": "11_1_1_1_xx",
                "typeName": "xx"
              }
            }
          ]
        },
        {
          "id": "11_1_2",
          "action": "add",
          "type": {
            "id": "11_1_2_xx",
            "typeName": "xx"
          },
          "item": [
            {
              "id": "11_1_2_1",
              "action": "add",
              "type": {
                "id": "11_1_2_1_zz",
                "typeName": "zz"
              }
            }
          ]
        }
      ]
    }
  ]
}

预期产出:

[
  {
    "id": "11_1",
    "action": "add",
    "type": {
      "id": "11_1_xx",
      "typeName": "xx"
    }
  },
  {
    "id": "11_1_1_1",
    "action": "add",
    "type": {
      "id": "11_1_1_1_xx",
      "typeName": "xx"
    }
}, {
    "id": "11_1_2",
    "action": "add",
    "type": {
      "id": "11_1_2_xx",
      "typeName": "xx"
    }
  }
]


你能帮我写一个简单的规范吗?

共有2个答案

江浩慨
2023-03-14

您可以考虑另一个库Josson,一个简单的语句就可以完成这项工作。该函数甚至支持未知和无限数量的路径级别。

https://github.com/octomix/josson

反序列化

Josson josson = Josson.fromJsonString(
    "{" +
    "  \"id\": 11," +
    "  \"item\": [" +
    "    {" +
    "      \"id\": \"11_1\"," +
    "      \"action\": \"add\"," +
    "      \"type\": {" +
    "        \"id\": \"11_1_xx\"," +
    "        \"typeName\": \"xx\"" +
    "      }," +
    "      \"item\": [" +
    "        {" +
    "          \"id\": \"11_1_1\"," +
    "          \"action\": \"add\"," +
    "          \"type\": {" +
    "            \"id\": \"11_1_1_zz\"," +
    "            \"typeName\": \"zz\"" +
    "          }," +
    "          \"item\": [" +
    "            {" +
    "              \"id\": \"11_1_1_1\"," +
    "              \"action\": \"add\"," +
    "              \"type\": {" +
    "                \"id\": \"11_1_1_1_xx\"," +
    "                \"typeName\": \"xx\"" +
    "              }" +
    "            }" +
    "          ]" +
    "        }," +
    "        {" +
    "          \"id\": \"11_1_2\"," +
    "          \"action\": \"add\"," +
    "          \"type\": {" +
    "            \"id\": \"11_1_2_xx\"," +
    "            \"typeName\": \"xx\"" +
    "          }," +
    "          \"item\": [" +
    "            {" +
    "              \"id\": \"11_1_2_1\"," +
    "              \"action\": \"add\"," +
    "              \"type\": {" +
    "                \"id\": \"11_1_2_1_zz\"," +
    "                \"typeName\": \"zz\"" +
    "              }" +
    "            }" +
    "          ]" +
    "        }" +
    "      ]" +
    "    }" +
    "  ]" +
    "}");
    

转型

JsonNode node = josson.getNode(
    "cumulateCollect(item[type.typeName='xx']*.field(item:), item).flatten(1)");
System.out.println(node.toPrettyString());

输出

[ {
  "id" : "11_1",
  "action" : "add",
  "type" : {
    "id" : "11_1_xx",
    "typeName" : "xx"
  }
}, {
  "id" : "11_1_2",
  "action" : "add",
  "type" : {
    "id" : "11_1_2_xx",
    "typeName" : "xx"
  }
}, {
  "id" : "11_1_1_1",
  "action" : "add",
  "type" : {
    "id" : "11_1_1_1_xx",
    "typeName" : "xx"
  }
} ]
艾心远
2023-03-14

需要通过第一个转换规范中的idtype.typeName值来分隔对象,以便在下一个规范中通过type.typeName=xx长过滤掉id值,通过使用@(1, id)。@(1, typeName)右侧叶元素的标识符,例如

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {
          "item": {
            "*": {
              "item": {
                "*": {
                  "type": {
                    "@(1,id)": "@(1,id).@(1,typeName).id",
                    "@(1,action)": "@(1,id).@(1,typeName).action",
                    "*": "@(1,id).@(1,typeName).&1.&" // &1 replicates key name "type"
                  }
                }
              },
              "type": {
                "@(1,id)": "@(1,id).@(1,typeName).id",
                "@(1,action)": "@(1,id).@(1,typeName).action",
                "*": "@(1,id).@(1,typeName).&1.&" // & replicates the values of the elements nested within the "type" object
              }
            }
          },
          "type": {
            "@(1,id)": "@(1,id).@(1,typeName).id",
            "@(1,action)": "@(1,id).@(1,typeName).action",
            "*": "@(1,id).@(1,typeName).&1.&"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "xx": ""
      }
    }
  }
]

http://jolt-demo.appspot.com/网站上的演示是

 类似资料:
  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我正在尝试根据属性值进行过滤。 我的目标是获得一个数组,其中只包含动作为“remove”的项目。 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图通过属性的内部值进行过滤。 我的目标是得到一个数组,它只包含类型为“xx”的项目。但不是所有的项目对象,只有一些字段 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

  • 我想使用JOLT转换做两件事: 过滤名为 myArray 的数组中的元素,以便仅保留具有“v_518”属性的元素 过滤掉除“v_518”和“LFDN”之外的其余元素的所有属性 输入: 期望输出: 到目前为止,我尝试了什么,但没有按预期工作: 我尝试使用http://jolt-demo.appspot.com/#andrewkcarter2中的示例,但我不知道如何做到这一点。

  • 我正在尝试使用 Jolt 转换来转换 Json,在这里寻找一些输入。我正在尝试过滤一个键,该键是另一个属性的值。这是我的输入和预期输出 我看到的输出是 我试过的规格是 但是我没有得到预期的输出。我也尝试了一些其他组合,但未能获得正确的输出。有人能帮忙吗?

  • 我需要使用JOLT将下面的输入JSON转换成下面列出的格式。链接是通过第一个数组元素的deps.name与第二个数组元素的spec.name来完成的。我对链接一无所知。谢谢你的帮助。 输入json 预期的输出格式

  • 我正在尝试将下面的JSON转换为名称值对: 应为输出JSON: 我使用了以下jolt规范,但是< code>RecordType元素的转换不符合预期: 颠簸规格 : 如何将其转换为所需的格式?