簡體   English   中英

使用@JsonAnyGetter時忽略了PropertyNamingStrategy

[英]PropertyNamingStrategy ignored when using @JsonAnyGetter

場景:

使用Jackson 2.4.5,我有一個要序列化為JSON的動態bean,它可以將其某些狀態存儲在內部映射的“可選”屬性中,並在返回此映射的訪問器方法上使用@JsonAnyGetter ,例如:

public class DynamicJsonView {

private final Map<String, Object> optionalProperties = new HashMap<>();

private final String rqdProperty = "blah";

public String getRqdProperty() {
    return rqdProperty;
}

public DynamicJsonView() {
    optionalProperties.put("PROP_1", "value 1");
    optionalProperties.put("PROP_2", "value 2");
    optionalProperties.put("PROP_3", "value 3");
    // etc - in reality populated from another map
}

@JsonAnyGetter
public Map<String, Object> any() {
    return Collections.unmodifiableMap(optionalProperties);
} 
}

請注意,映射鍵為UPPER_CASE。 設置ObjectMapper我們設置了以下命名策略以將屬性轉換為小寫(並將camelCase替換為snake_case),例如:

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

問題:

該工程完全按照正常的Java性能預期,即rqdProperty在上面的例子中轉換為rqd_property在JSON序列化形式,但命名策略似乎忽略了地圖上“屬性”,與上按鍵的情況下出現的修改。 調試了jackson LowerCaseWithUnderscoresStrategy#translate方法並觀察了對象被序列化時傳遞的input參數值,看來這些鍵從未通過命名策略傳遞。

顯而易見的解決方法是對映射鍵進行預處理並將其全部轉換為小寫,但是我想知道關於屬性命名策略是否缺少某些東西,或者這僅僅是庫的限制嗎?

之所以這樣設計是因為NamingStrategy僅應用於實際的混凝土屬性,而不應用於Map鍵或“任何”屬性。

但是,如果包括對任何屬性進行名稱修飾的功能聽起來像是一個好主意,則可以請求一個新功能來實現:例如,可以通過@JsonAnySetter標志啟用該@JsonAnySetter

https://github.com/FasterXML/jackson-databind/issues/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM