Спецификация Jolt для преобразования массива JSON внутри массива

#json #jolt

#json #jolt

Вопрос:

Я пытаюсь преобразовать файл JSON во что-то, что позже можно преобразовать в csv или xml. Мой файл JSON выглядит следующим образом:

 {
  "meta": {
    "contentType": "Response"
  },
  "content": {
    "_type": "Response",
    "data": {
      "_type": "ObjectList",
      "meta": {
        "_type": "ObjectListMeta"
      },
      "DataObjects": [
        {
          "head": {
            "fields": {
              "id": {
                "value": "24"
              },
              "name": {
                "value": ""
              }
            }
          },
          "table": [
            {
              "number": 1,
              "fields": {
                "height": {
                  "value": 500,
                  "text": "500"
                },
                "average": {
                  "value": -2,
                  "text": "-2"
                }
              }
            },
            {
              "number": 2,
              "fields": {
                "height": {
                  "value": 99999,
                  "text": "99999"
                },
                "average": {
                  "value": -5,
                  "text": "-5"
                }
              }
            }
          ]
        }
      ]
    }
  }
}
  

Я хочу, чтобы результат выглядел следующим образом:

 [
  {
    "id": "24",
    "name": "",
    "height": 500,
    "average": -2
  },
  {
    "id": "24",
    "name": "",
    "height": 99999,
    "average": -5
  }
]
  

Я попробовал следующую спецификацию JOLT:

 [
  {
    "operation": "shift",
    "spec": {
      "content": {
        "data": {
          "DataObjects": {
            "*": {
              "head": {
                "fields": {
                  "id": {
                    "value": "[amp;4].id"
                  },
                  "name": {
                    "value": "[amp;4].name"
                  }
                }
              },
              "table": {
                "*": {
                  "fields": {
                    "height": {
                      "value": "[amp;5].height"
                    },
                    "average": {
                      "value": "[amp;5].average"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
]
  

Но я получаю только следующий вывод:

 [
  {
    "id": "24",
    "name": "",
    "height" : [ 500, 99999 ],
    "average" : [ -2, -5 ]
  }
]
  

Это не совсем то, что я хочу. Как мне изменить свою спецификацию, чтобы получить нужный мне результат?

Ответ №1:

Вы можете объединить эти атрибуты в списке таблиц как имеющие несколько соответствующих объектов для одного заголовка.объекты полей, такие как

 [
  {
    "operation": "shift",
    "spec": {
      "content": {
        "*": {
          "DataObjects": {
            "*": {
              "table": {
                "*": {
                  "@(2,head.fields.id.value)": "[amp;].id",
                  "@(2,head.fields.name.value)": "[amp;].name",
                  "@(0,fields.height.value)": "[amp;].height",
                  "@(0,fields.average.value)": "[amp;].average"
                }
              }
            }
          }
        }
      }
    }
  }
]