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

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

薛高澹
2023-03-14

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

我的目标是获得一个数组,其中只包含动作为“remove”的项目。

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

输入:

{
  "id": 11,
  "item": [
    {
      "id": "11_1",
      "action": "add",
      "item": [
        {
          "id": "11_1_1",
          "action": "add",
          "item": [
            {
              "id": "11_1_1_1",
              "action": "remove"
            }
          ]
        },
        {
          "id": "11_1_2",
          "action": "remove",
          "item": [
            {
              "id": "11_1_2_1",
              "action": "remove"
            }
          ]
        }
      ]
    }
  ]
}

预期产出:

[
  {
    "id": "11_1_1_1",
    "action": "remove"
  },
  {
    "id": "11_1_2",
    "action": "remove"
  },
  {
    "id": "11_1_2_1",
    "action": "remove"
  }
]

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

共有2个答案

勾向文
2023-03-14

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

https://github.com/octomix/josson

反序列化

Josson josson = Josson.fromJsonString(
    "{" +
    "  \"id\": 11," +
    "  \"item\": [" +
    "    {" +
    "      \"id\": \"11_1\"," +
    "      \"action\": \"add\"," +
    "      \"item\": [" +
    "        {" +
    "          \"id\": \"11_1_1\"," +
    "          \"action\": \"add\"," +
    "          \"item\": [" +
    "            {" +
    "              \"id\": \"11_1_1_1\"," +
    "              \"action\": \"remove\"" +
    "            }" +
    "          ]" +
    "        }," +
    "        {" +
    "          \"id\": \"11_1_2\"," +
    "          \"action\": \"remove\"," +
    "          \"item\": [" +
    "            {" +
    "              \"id\": \"11_1_2_1\"," +
    "              \"action\": \"remove\"" +
    "            }" +
    "          ]" +
    "        }" +
    "      ]" +
    "    }" +
    "  ]" +
    "}");
    

转型

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

输出

[ {
  "id" : "11_1_2",
  "action" : "remove"
}, {
  "id" : "11_1_1_1",
  "action" : "remove"
}, {
  "id" : "11_1_2_1",
  "action" : "remove"
} ]
步兴为
2023-03-14

>

  • 让我们通过在第一个规范中遍历树时确定案例是“item”else case(“*”)来展平JSON。

    并通过它们的操作名称标记单个数组

    然后选择remove数组的对象

    [
      {
        "operation": "shift",
        "spec": {
          "item": {
            "*": {
              "item": {
                "*": {
                  "item": {
                    "*": {
                      "*": "@(1,id)[&1].&"
                    }
                  },
                  "*": "j[&1].&"
                }
              },
              "*": "i[&1].&"
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "*": {
            "*": "@(0,action)"
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "remove": {
            "*": ""
          }
        }
      }
    ]
    

    操场现场的演示(http://jolt-demo.appspot.com/)是

  •  类似资料:
    • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图通过属性的内部值进行过滤。 我的目标是获得一个只包含类型名为' xx '的项目的数组。 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

    • 我正在尝试使用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元素的转换不符合预期: 颠簸规格 : 如何将其转换为所需的格式?