【问题标题】:Change JSON property name on derived classes using Jackson library使用 Jackson 库更改派生类的 JSON 属性名称
【发布时间】:2018-04-16 08:02:50
【问题描述】:

我正在使用 Spring 开发新的 REST API,我有 BaseResponse 类作为所有响应的基本响应。这个类包含属性String requestUuid; 在某些情况下这个requestUuid 必须用属性名称requestUuid 序列化,在其他情况下它必须序列化为request_uuid,我知道我可以使用@JsonProperty 作为字段级注释,但它会影响所有响应。是否有任何方法可以专门为每个派生类覆盖属性名称。

【问题讨论】:

    标签: java json spring jackson


    【解决方案1】:

    您可以在方法级别使用@JsonProperty。这样,您可以在子类中覆盖该字段的 getter 方法并对其进行注释。

    例如:

    class BaseResponse {
        private String requestUuid;
    
        public getRequestUuid() {
            return requestUuid;
        }
    }
    
    class OtherResponse extends BaseResponse {
        @Override
        @JsonProperty("request_uuid")
        public getRequestUuid() {
            return super.getRequestUuid();
        }
    }
    

    【讨论】:

    • 结果 JSON 将包含两个字段“requestUuid”和“request_uuid”。例如:{"requestUuid":uuid, "request_uuid":uuid}。如果结果 JSON 不希望父字段“requestUuid”,则使用 @JsonIgnoreProperties({"requestUuid"}) 那么结果 JSON 将是 {"request_uuid":uuid}
    【解决方案2】:

    您可以使用不同的键名发送两次该字段。

    @JsonAnyGetter
    public Map<String, Object> otherFields() {
        Map<String, Object> otherFields = new HashMap<>();
        otherFields.put("requestUuid", this.requestUuid);
        otherFields.put("request_uuid", this.requestUuid);
        return otherFields;
    }
    

    另外,请忽略您的实际字段:

    @JsonIgnore
    private String requestUuid;
    

    【讨论】:

      【解决方案3】:

      不,这是不可能的,你可以为不同类型的请求创建新类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2011-11-07
        • 1970-01-01
        • 2015-09-18
        • 2021-12-07
        相关资源
        最近更新 更多