[英]Using JsonAnySetter and JsonAnyGetter with ArrayList within Hashmap
[英]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
:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.