场景:
使用 Jackson 2.4.5 我有一个要序列化为 JSON 的动态 bean,它可以将其一些状态存储在内部映射的“可选”属性中,并在访问器方法上使用 @JsonAnyGetter
返回此 map ,例如:
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);
}
}
请注意, map 键为 UPPER_CASE。当我们设置ObjectMapper
时,我们设置以下命名策略将属性转换为小写(并将camelCase替换为snake_case),例如:
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
问题:
这与普通 java 属性的预期完全一样,即上面示例中的 rqdProperty
转换为 JSON 序列化形式的 rqd_property
,但命名策略似乎被忽略了 map “属性”,大写键显示未修改。调试了 Jackson LowerCaseWithUnderscoresStrategy#translate
方法并观察了对象序列化时传入的 input
参数值,似乎键从未通过命名策略传递。
明显的解决方法是预处理映射键并将它们全部转换为小写,但我想知道在属性命名策略方面是否缺少某些内容,或者这是否只是库的限制?
最佳答案
这是按照设计的,因为 NamingStrategy
仅应用于实际的具体属性,而不适用于 Map
键或“任何”属性。
但是,如果为任何属性包含名称修改的能力听起来是个好主意,您可以请求一个新功能来实现这一点:它可以通过 @JsonAnySetter
标志来启用(例如) :
关于java - 使用 @JsonAnyGetter 时忽略 PropertyNamingStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482597/