互斥JSON的Jolt变换

互斥JSON的Jolt变换,json,transformation,jolt,Json,Transformation,Jolt,我正在尝试使用JOLT规范转换输入JSON。我的输入有一个response元素,它可以有一个文本(案例1)值或一个JSON元素(案例2),如下所示 Case 1 response should look like. { "statusMessage" : "Connection Error", "status" : "FAILED" } Case 2 response should look like this. { "statusMessage" : "Internal Serv

我正在尝试使用JOLT规范转换输入JSON。我的输入有一个response元素,它可以有一个文本(案例1)值或一个JSON元素(案例2),如下所示

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

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

[
  {
    "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
    }
  }
}
如果我想在响应包含JSON元素的情况下将“reasonPhrase”分配给statusMessage,那么如何指定JOLT规范

我的输出应该如下所示

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

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

我想我可以使用以下任一规格:

(一)

链中的第一个规范将响应值存储到
statusMessage
字段中。第二个将用嵌套的
reasonPhrase
值(如果存在)覆盖
statusMessage
字段。链中的最后一个规范只保留
状态
状态消息
字段

(二)


它创建一个名为
statusMessage
的数组,如果
response
是一个字符串,则数组中会有一个元素,如果嵌套,则数组中会有两个元素,第二个元素是所需的状态消息。因此,第二个规范用其数组中的最后一个元素覆盖了
statusMessage
字段。

我想我可以使用以下规范之一:

(一)

链中的第一个规范将响应值存储到
statusMessage
字段中。第二个将用嵌套的
reasonPhrase
值(如果存在)覆盖
statusMessage
字段。链中的最后一个规范只保留
状态
状态消息
字段

(二)

它创建一个名为
statusMessage
的数组,如果
response
是一个字符串,则数组中会有一个元素,如果嵌套,则数组中会有两个元素,第二个元素是所需的状态消息。因此,第二个规范用其数组中的最后一个元素覆盖
statusMessage
字段

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