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

JOLT移位转换:收集所有关卡中的所有物品,而不知道有多少个关卡

百里鸿祯
2023-03-14

我正在尝试使用 Jolt 转换来转换 JSON,在这里寻找一些输入。我正在尝试将所有级别中的所有项目放入一个数组中。

我的目标是获得一个包含所有项目的数组,而不知道我在json中有多少个级别。

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

如果我有三个等级:

输入:

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

预期产出:

[
  {
    "id": "11_1"
  },
  {
    "id": "11_1_1"
  },
    {
    "id": "11_1_1_1"
  },
  {
    "id": "11_1_2"
  },
    {
    "id": "11_1_2_1"
  }
]

如果我有两个级别:

输入:

{
  "id": 11,
  "item": [
    {
      "id": "11_1",
      "item": [
        {
          "id": "11_1_1"
        },
        {
          "id": "11_1_2"
        }
      ]
    }
  ]
}

预期产出:

[
  {
    "id": "11_1"
  },
  {
    "id": "11_1_1"
  },
  {
    "id": "11_1_2"
  }
]

我试着写下这样的话:

[
  {
    "operation": "shift",
    "spec": {
      "item": {   //to cover the second level
        "*": "item"
      }
    }
    },
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {    //to cover the 3td level
          "item": {
            "*": "item"
          }
        }
      }
    }
    }
]

结果为空,如果我单独运行每个转换,我会在适用时得到结果。你能帮我写一个简单的规范吗?

共有2个答案

农波涛
2023-03-14

使用库乔森无限水平的解决方案。

https://github.com/octomix/josson

反序列化

Josson josson = Josson.fromJsonString(
    "{" +
    "  \"id\": 11," +
    "  \"item\": [" +
    "    {" +
    "      \"id\": \"11_1\"," +
    "      \"quantity\": 1," +
    "      \"action\": \"add\"," +
    "      \"state\": \"x\"," +
    "      \"item\": [" +
    "        {" +
    "          \"id\": \"11_1_1\"," +
    "          \"quantity\": 2," +
    "          \"action\": \"drop\"," +
    "          \"state\": \"y\"" +
    "        }," +
    "        {" +
    "          \"id\": \"11_1_2\"," +
    "          \"quantity\": 3," +
    "          \"action\": \"modify\"," +
    "          \"state\": \"z\"" +
    "        }" +
    "      ]" +
    "    }" +
    "  ]" +
    "}");

转型

JsonNode node = josson.getNode("item.cumulateCollect(field(item:), item)");
System.out.println(node.toPrettyString());

语句字段(项:) 从当前对象中删除字段
cumulateCollect() 的第二个参数表示下一个级别。在本例中为项目

输出

[ {
  "id" : "11_1",
  "quantity" : 1,
  "action" : "add",
  "state" : "x"
}, {
  "id" : "11_1_1",
  "quantity" : 2,
  "action" : "drop",
  "state" : "y"
}, {
  "id" : "11_1_2",
  "quantity" : 3,
  "action" : "modify",
  "state" : "z"
} ]
秦奇
2023-03-14

如果输入像您的情况一样最多有3个级别,则使用此规范

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {
          "id": "&",
          "item": {
            "*": {
              "id": "&",
              "item": {
                "*": {
                  "id": "&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "id": {
        "*": "[#1].&1"
      }
    }
  }
]

以便仅使用这一个来处理两种情况。如果还需要一个级别,则添加

,
"item": {
  "*": {
    "id": "&"
  }
}

就在最里面

"id": "&"

编辑:如果您有一些不同于< code>id的其他属性,就像下面的输入示例中那样

{
  "id": 11,
  "item": [
    {
      "id": "11_1",
      "quantity": 1,
      "action": "add",
      "state": "x",
      "item": [
        {
          "id": "11_1_1",
          "quantity": 2,
          "action": "drop",
          "state": "y"
        },
        {
          "id": "11_1_2",
          "quantity": 3,
          "action": "modify",
          "state": "z"
        }
      ]
    }
  ]
}

而不仅仅是一点点修改就可以处理您的新案例:

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {
          "*": "&",
          "item": {
            "*": {
              "*": "&",
              "item": {
                "*": {
                  "*": "&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[#1].&1"
      }
    }
  }
]

这将产生:

[
  {
    "id": "11_1",
    "quantity": 1,
    "action": "add",
    "state": "x"
  },
  {
    "id": "11_1_1",
    "quantity": 2,
    "action": "drop",
    "state": "y"
  },
  {
    "id": "11_1_2",
    "quantity": 3,
    "action": "modify",
    "state": "z"
  }
]
 类似资料:
  • 我正在尝试使用 Jolt 转换来转换 JSON,在这里寻找一些输入。我正在尝试将所有级别中的所有项目放入一个数组中。我的目标是获得一个包含所有项目的数组,而不知道我在 json 中有多少个级别。 这是我的输入和预期输出: 输入: 预期产出: 我的震动规格: 结果: 只有前4项包含id和foo,但并不是它们的foo值都只有一个。 你能告诉我怎么做对吗?

  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图将所有级别的内部项目放入一个数组中。我的目标是得到一个包含部分条目的数组,而不需要知道我在一个spen中的一个列表中有多少级。 这是我的输入和预期输出: 输入: 预期产出:(列表) 我的震动规格: 我的输出: 如果输入中有多个项目,我会得到一个列表,但如果只有一个项目,则不会。你知道我应该怎么把它转换成

  • 如何将焦点更改为另一个字段,例如JButton?还是把注意力集中在一起?当前,当我的应用程序加载时,它会选择(看起来是)一个随机的JTextField来设置焦点! 我试过了 但是在这里没有运气。我也尝试过如何解除JTextField的焦点,但是我也没有任何运气。 我不想关注JTextFields的原因是为了避免在应用程序首次加载时没有出现提示。 正如你从图片中看到的,在JTextFields上没有

  • 我继承了一台真正古老的Jenkins服务器,需要从操作系统开始重新构建,我正准备将我们的构建迁移过来。然而,有一个多分支管道,特别是有几十个特性/错误修复/etc分支和构建,需要大量的时间和资源。当我最初在测试集群上设置其多分支管道时,所有分支的初始构建占用了所有资源数小时,直到我杀死它们。 我想做的是让所有分支最初都导入,但在分支再次推送或PR之前不会构建。目前,我已经应用了定义的“抑制自动SC

  • 我一直在玩API、XAPI和OSM的天桥。但我无法获得所需的一些信息:获取街道的所有信息节点。 这里有一个例子:http://www.openstreetmap.org/browse/way/5671291 这提供了一种称为“瓦茨街”(在纽约)的方式的信息,但它不是所有的街道,只是其中的一部分。 另一部分:http://www.openstreetmap.org/browse/way/461163

  • 所以我有一个棋盘,表示为64大小的数组,左上角的正方形为0,右下角的正方形为63。我有这个函数,可以给出国王所有可能的移动。 其中i是King当前所在的正方形的编号。 如果国王不在棋盘边缘,这一点就行了。 但是,如果国王位于右下角的方块上,即数字63,则函数会将数字56的左下角方块作为国王移动的有效位置。 有没有什么有效的方法可以知道国王正在走向另一个边缘,这不是一个有效的举动? 我几乎所有的作品