Преобразование толчка JSON с взаимным исключением - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь преобразовать входной JSON, используя спецификацию JOLT.Мой вход имеет элемент ответа, который может иметь одно текстовое значение (случай 1) ИЛИ элемент JSON (случай 2), как показано ниже

JOLT Spec:

[
  {
    "operation": "shift",
    "spec": {
      "@(1,status)": {
        "@(2,output)": {
          "response": "statusMessage"
        },
        "TERMINATED": {
          "@(2,status)": "statusMessage"
        },
        "FAILED": {
          "@(2,response)": "statusMessage"
        },
        "COMPLETED": {
          "@(2,status)": "statusMessage"
        }
      },
      "status": "status"
    }
  }
]

Вход (не-JSON)элемент ответа).---- Случай 1

{
  "createTime": 1555623377858,
  "updateTime": 1555623378681,
  "status": "FAILED",
  "output": {
    "response": "Connection error."
  }
}

Ввод (элемент ответа JSON).---- Случай 2

{
  "createTime": 1555623377858,
  "updateTime": 1555623378681,
  "status": "FAILED",
  "output": {
    "response": {
      "headers": {
        "ETag": [
          "W/\"5-fy9qFc+NorJ+Wkr0e1jnrXHAs9k\""
        ],
        "Connection": [
          "keep-alive"
        ],
        "Content-Length": [
          "5"
        ],
        "Date": [
          "Thu, 18 Apr 2019 21:36:18 GMT"
        ],
        "Content-Type": [
          "text/html; charset=utf-8"
        ],
        "X-Powered-By": [
          "Express"
        ]
      },
      "reasonPhrase": "Internal Server Error",
      "body": "Error",
      "statusCode": 500
    }
  }
}

Как мне указать спецификацию JOLT, если я хочу назначить "reasonPhrase" для statusMessage в случае, когда ответ содержит элемент JSON?

Мой вывод долженвыглядеть ниже

Case 1 response should look like.
{
  "statusMessage" : "Connection Error",
  "status" : "FAILED"
}

Case 2 response should look like this.
{
  "statusMessage" : "Internal Server Error",
  "status" : "FAILED"
}

1 Ответ

2 голосов
/ 23 апреля 2019

Я думаю, что он работает с любой из следующих спецификаций:

1)

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "statusMessage": "@(1,output.response)"
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "statusMessage": "@(1,output.response.reasonPhrase)"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "status": "status",
      "statusMessage": "statusMessage"
    }
  }
]

Первая спецификация в цепочке будет хранить значение ответа в statusMessageполе.Второй перезапишет поле statusMessage вложенным значением reasonPhrase (если оно существует).Последняя спецификация в цепочке просто содержит поля status и statusMessage.

2)

[
  {
    "operation": "shift",
    "spec": {
      "output": {
        "response": {
          "@(1,response)": "statusMessage[]",
          "headers": {
            "@(1,reasonPhrase)": "statusMessage[]"
          }
        }
      },
      "status": "status"
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "statusMessage": "=lastElement(@(1,statusMessage))"
    }
  }
]

Создает массив с именем statusMessage, если response являетсяВ массиве будет один элемент, если он вложенный, в массиве будет два элемента, а второй - желаемое сообщение о состоянии.Таким образом, вторая спецификация перезаписывает поле statusMessage последним элементом в своем массиве.

...