使用Jackson库更改派生类的JSON属性名称

k97glaaz  于 2023-01-06  发布在  其他
关注(0)|答案(4)|浏览(152)

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

2ekbmq32

2ekbmq321#

你可以在方法层使用@JsonProperty,这样,你就可以在子类中覆盖字段的getter方法并对其进行注解。
例如:

class BaseResponse {
    private String requestUuid;

    public getRequestUuid() {
        return requestUuid;
    }
}

class OtherResponse extends BaseResponse {
    @Override
    @JsonProperty("request_uuid")
    public getRequestUuid() {
        return super.getRequestUuid();
    }
}
2j4z5cfb

2j4z5cfb2#

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

@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;
ukxgm1gy

ukxgm1gy3#

扩展@JoshA响应,另一种方法是定义一个构造函数并对其进行注解,这样可以避免重写派生类中的getter方法,从而使代码更加简洁。

class BaseResponse {
    private String firstName;
    private String lastName;

    public BaseResponse(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
    }

    public getFirstName() {
        return firstName;
    }

    public getLastName() {
        return lastName;
    }
}

class OtherResponse extends BaseResponse {
    public OtherResponse(@JsonProperty("given_name") String firstName, @JsonProperty("family_name") String lastName) {
       super(firstName, lastName);
    }
}
8dtrkrch

8dtrkrch4#

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

相关问题