【问题标题】:Jackson Serialize overloaded output杰克逊序列化过载输出
【发布时间】:2022-01-14 12:23:01
【问题描述】:

我有一个 API 正在扩展以供另一个系统使用。 Pre-req 存在,每个前端对一个 json 字段有不同的期望。

示例: 响应字段“金额”必须是字符串或整数,具体取决于我从下游接收到的值。所以在某些情况下,我会在 json 中返回一个字符串值,而在其他情况下,我会返回 int。

预期的 json 输出:

{
    "amount": 21
}

{
    "amount": "21"
}

我做了以下事情:

class Response {

    @JsonProperty("amount")
    private int amount;
    
    @JsonProperty("amount")
    private String amountString;

// Getters and setters

希望我能够为 json 字段“金额”返回一个 int 或 String 值,但我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException:属性“amount”的getter定义冲突

任何帮助将不胜感激

【问题讨论】:

    标签: java spring-boot serialization jackson


    【解决方案1】:

    你不能那样做。您的 JSON 中的元素称为 amount,您不能将其绑定到 2 个不同的变量。

    您收到此异常是因为 @JsonProperty("amount") 用于 2 个单独的类字段。

    最好创建 2 个不同的响应:

    例子:

    class FrontEndResponse1 {
    
        @JsonProperty("amount")
        private int amount;
    
       //getter/setter
        
    }
    
    class FrontEndResponse2 {
    
        @JsonProperty("amount")
        private String amount;
    
        //getter/setter
        
    }
    

    【讨论】:

      【解决方案2】:

      是的,这不适用于类型化的返回值。

      除非您可以提供 2 个具有不同返回类型的端点,否则您可以返回一个普通的 Map<String, Object> 而不是 Response

      public Map<String, Object> awkwardMethod(boolean wantString) {
        Response response = new Response();
        ... // do business logic
        return Map.of("amount", wantString ? String.value(response.amount) : response.amount);
      }
      

      明确一点:我不鼓励您这样做,因为您会丢失返回值的类型信息并引入容易出错的手动映射。我只是为应该通过提供清晰的 API 和坚持使用此 API 的客户端来解决的问题提供解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2020-12-24
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多