使用 Jackson 映射不同的 HTTP JSON 响应

Mapping different HTTP JSON response using Jackson

我正在使用 Spring(Kotlin) 创建网络服务器,并尝试使用 Jackson 映射 JSON 响应。 我需要向其他 API 服务器发送请求,所以我决定使用 OkHttp 发送请求。 但是,有一个问题,如果另一个 API 服务器响应 4XX 之类的错误,Jackson 无法映射响应,因为响应具有不同的 JSON 结构。

代码如下:

@PostMapping("/test")
fun test(@org.springframework.web.bind.annotation.RequestBody requestJSON: RequestJSON): Message {
    val JSON: MediaType = "application/json; charset=utf-8".toMediaType()
    val mapper = ObjectMapper()
    val requestJSONString: String = mapper.writeValueAsString(requestJSON)

    val client = OkHttpClient()
    val body: RequestBody = requestJSONString.toRequestBody(JSON)
    val request: Request = Request.Builder()
        .header("clientid", "blahblah")
        .header("secret", "blahblah")
        .url("blahblah")
        .post(body)
        .build()
    val response: Response = client.newCall(request).execute()
    return mapper.readValue(response.body?.string(), Message::class.java)
}

class“消息”的结构如下:

class Message {
    var message = NestedMessage()

    class NestedMessage {
        @JsonProperty("@type")
        var type: String? = null

        @JsonProperty("@service")
        var service: String? = null

        @JsonProperty("@version")
        var version: String? = null

        @JsonProperty("result")
        var resultObject = Result()

        class Result {
            var srcLangType: String? = null
            var tarLangType: String? = null
            var translatedText: String? = null
            var engineType: String? = null
            var pivot: String? = null
            var dict: String? = null
            var tarDict: String? = null
        }
    }
}

并且,其他 API 服务器的错误具有如下结构:

class Error {
    var errCode: String? = null
    var errMessage: String? = null
}

如何映射不同的 JSON 响应?

您应该为北向 API 和南向 API 创建两个不同的结构。

对于南向 API,将 errCodeerrMessage 添加到 SouthBoundMessage。或者如果可以的话检查 HTTP 状态代码,然后使用不同的 Jackson 映射器来获取错误消息。

然后把SouthBoundMessage转成NorthBoundMessage,就是你的业务逻辑。

Return NorthBoundMessage 和北向 API 消费者的相应 HTTP 代码。