Мне нужна спецификация толчка для входного json ниже с динамическим полем даты и массивом элементов. Эта спецификация тряски должна преобразовать этот входной json в выходной json.
Введите Json:
{
"market": {
"2024-04-13": [
{
"code": "ABC",
"name": "Name1",
"date": "2024-04-13T00:00:00.000Z",
"rev": 100,
"sold": 1
}
],
"2024-04-14": [
{
"code": "DEF",
"name": "Name2",
"date": "2024-04-14T00:00:00.000Z",
"rev": 233.32,
"sold": 3
},
{
"code": "EFG",
"name": "DISCOUNT",
"date": "2024-04-14T00:00:00.000Z",
"rev": 300.05,
"sold": 1
},
{
"code": "MNO",
"name": "GROUP",
"date": "2024-04-14T00:00:00.000Z",
"rev": 45.33,
"sold": 3
}
],
"2024-04-15": [
{
"code": "POR",
"name": "TEST",
"date": "2024-04-15T00:00:00.000Z",
"rev": 100,
"sold": 1
}
]
}
}
Вывод в формате JSON
{
"market": {
"DATE": [
{
"code": "ABC",
"name": "Name1",
"date": "2024-04-13T00:00:00.000Z",
"rev": 100,
"sold": 1
},
{
"code": "DEF",
"name": "Name2",
"date": "2024-04-14T00:00:00.000Z",
"rev": 233.32,
"sold": 3
},
{
"code": "EFG",
"name": "DISCOUNT",
"date": "2024-04-14T00:00:00.000Z",
"rev": 300.05,
"sold": 1
},
{
"code": "MNO",
"name": "GROUP",
"date": "2024-04-14T00:00:00.000Z",
"rev": 45.33,
"sold": 3
},
{
"code": "POR",
"name": "TEST",
"date": "2024-04-15T00:00:00.000Z",
"rev": 100,
"sold": 1
}
]
}
}
Приведенную ниже спецификацию Jolt я попробовал, но она не дает точного результата. Он группирует первые несколько элементов, но мне нужны они отдельно, как и выходные данные json.
Спецификация встряхивания
[
{
"operation": "shift",
"spec": {
"market": {
"*": {
"*": {
"code": "market[&1].code",
"name": "market[&1].name",
"date": "market[&1].date",
"rev": "market[&1].rev",
"sold": "market[&1].sold"
}
}
}
}
}
]
Вам следует разделить эти даты в сочетании со значениями подиндексов (0,1,2), чтобы иметь возможность различать все подобъекты, такие как
[
{
"operation": "shift",
"spec": {
"*": { //lhe layer for the "market"
"*": { //the layer for the arrays
"*": { //the layer for the indexes of the arrays
"*": "&3.&2_&1.&" // &3 : going 3 levels up to bring the literal "market"
// &2 : the date values
// &1 : the indexes of the arrays
// & : the leaf node which represents the replication the respective value
}
}
}
}
},
{ //arrange the key names of the outermost objects
"operation": "shift",
"spec": {
"*": {
"*": {
"*": "&2.DATE[#2].&"
}
}
}
}
]
демо на сайте https://jolt-demo.appspot.com/ это:
Обновлено: следующий вариант (который предложил @samersaleh [спасибо ему]) будет более простым:
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": "&2.DATE[]"
}
}
}
}
]
Конечно, @Optimizer. В таком случае вы пишете один за другим, как вы это делали, или "code|name|date|rev|sold": "&3.&2_&1.&"
или продолжаете использовать "*":"&"
модель пары ключ-значение, как я уже сделал, и добавляете дополнительную спецификацию «удалить», чтобы избавиться от всех нежелательных атрибутов.
@Optimizer понял, что я пропустил добавленный прямо сейчас DATE
, будьте осторожны.
@Barbaros Özhan, если не указывать поля, я не вижу способа сделать это без второго толчка, но если это не так, то одной спецификации толчка должно быть достаточно, если только я что-то не упускаю: [ { "operation": "shift ", "spec": { "": { "": { "*": "market.DATE[]" } } } } ]
Ты прав @samersaleh, твое предложение лучше
Барбарос Ожан и @samersaleh Спасибо за вашу поддержку. Это сработало. !!
Спасибо за вашу поддержку @Barbaros Ozhan. Но мне нужно упомянуть каждое поле (например, код, имя, дату, версию, продано и т. д.) в спецификации толчка (например, "код": "рынок[&1].код", "имя": "рынок[&1].имя" ), так что любые дополнительные поля входят во входной json, кроме того, что определено в спецификации json, тогда эти дополнительные поля следует игнорировать и не должны присутствовать в выходном json. но если мы предоставим *, все поля будут помещены в выходной json. Пожалуйста, дайте мне знать, если что. Спасибо!