我是第一次接触Jolt,并试图转换一个拥有数组对象数组的JSON.我注意到的是,一个父级的子数组元素("time")与另一个父级的子数组混合在一起.请告诉我怎么解决这个问题?

Input JSON

[
  {
    "id": "1",
    "name": "data1",
    "opening": [
      {
        "From": "07:30:01",
        "To": "17:30:01"
      },
      {
        "From": "07:30:02",
        "To": "17:30:02"
      }
    ]
  },
  {
    "id": "2",
    "name": "data2",
    "opening": [
      {
        "From": "07:30:03",
        "To": "17:30:03"
      },
      {
        "From": "07:30:04",
        "To": "17:30:04"
      }
    ]
  }
]

Jolt Spec

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "id": "[&1].id",
        "name": "[&1].name",
        "opening": {
          "*": {
            "From": "[&1].timing.[&3].times[0].from",
            "To": "[&1].timing.[&3].times[0].to"
          }
        }
      }
    }
  }
]

Expected output

[ {
  "id" : "1",
  "name" : "data1",
  "timing" : [ {
    "times" : [ {
      "from" : "07:30:01",
      "to" : "17:30:01"
    } ]
  }, {
    "times" : [ {
      "from" : "07:30:02",
      "to" : "17:30:02"
    } ]
  } ]
}, {
  "timing" : [ {
    "times" : [ {
      "from" : "07:30:03",
      "to" : "17:30:03"
    } ]
  }, {
    "times" : [ {
      "from" : "07:30:04",
      "to" : "17:30:04"
    } ]
  } ],
  "id" : "2",
  "name" : "data2"
} ]

Current ouput

[ {
  "id" : "1",
  "name" : "data1",
  "timing" : [ {
    "times" : [ {
      "from" : "07:30:01",
      "to" : "17:30:01"
    } ]
  }, {
    "times" : [ {
      "from" : "07:30:03",
      "to" : "17:30:03"
    } ]
  } ]
}, {
  "timing" : [ {
    "times" : [ {
      "from" : "07:30:02",
      "to" : "17:30:02"
    } ]
  }, {
    "times" : [ {
      "from" : "07:30:04",
      "to" : "17:30:04"
    } ]
  } ],
  "id" : "2",
  "name" : "data2"
} ]

如果你看到JSON数组,第一个id为1的对象包含以"01""03"结尾的时间,第二个id为2的对象包含以"02""04"结尾的时间.我期待分别是"01""02"和"03""04".

推荐答案

我认为您在设置新 struct 时混淆了父数组索引&;n,例如:

设置name,id是正确的,因为您需要上一级才能到达父数组,因此使用[&;1]是正确的.

然而,在[&;1]中设置开始计时数组是错误的.计时索引现在应该在级别3,因为您需要它作为顶级父数组的一部分,所以您从当前的From,到Level从0一直计数到3才能到达父array.

设置时间数组"[&;3].Times[0]"也是错误的,因为分组应该类似于上面级别1的开始array.我也不确定是什么 假设在时间[0]中为0,则应使用#表示每个时间都在同一对象下对From、To分组.

根据上面的信息,规格应该是这样的:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[&1].&",
        "opening": {
          "*": {
            "From": "[&3].timing.[&1].times[#].from",
            "To": "[&3].timing.[&1].times[#].to"
          }
        }
      }
    }
  }
]

Java相关问答推荐

在FML中删除关键帧动画

JPackaged应用程序启动MSI调试,然后启动System. exit()

空手道比赛条件

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

scanner 如何在执行hasNextLine一次后重新读取整个文件?

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

从Spring5迁移到Spring6:无法在雅加达包中找到类

Java流传输一个列表并创建单个对象

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

使用PDFBox从PDF中删除图像

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

如何生成指定范围内的11位序列号?

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

我该如何为我的类编写getter和setter方法?

具有多个分析模式的复杂分隔字符串的正则表达式

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?

无泄漏函数的Java DRY

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别

如何使用Jackson读取以方括号开头的JSON?