java - 使用 @JsonAnyGetter 时忽略 PropertyNamingStrategy

标签 java json jackson spring-boot

场景:

使用 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 标志来启用(例如) :

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

关于java - 使用 @JsonAnyGetter 时忽略 PropertyNamingStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482597/

相关文章:

java - 使用 JavaAPI 将 CSV 文件批量上传到 Elasticsearch

java - 线程 "main"java.lang.NoClassDefFoundError : com/fasterxml/jackson/annotation/JsonAutoDetect Error when trying to convert json to POJO 中的异常

java - 来自 servlet 的 RemoteApi 调用未在本地应用程序引擎应用程序中加载

javascript - 在 JSON 中查找给定键的值并使用 javascript 更改该值

c# - SerializeObject 添加 unicode c#

javascript - 如何在 TypeScript 项目的 JSON 类中重写 JSON.stringify 方法,而不是在自定义调用中?

java - Jackson - 将 boolean 值序列化为 1/0 而不是 true/false

java - 如何使用 System.currentTimeMillis() 管理剩余时间

java - 两个Web应用程序共享的JAR可以登录到Tomcat中的相同文件吗?

java - 释放 Android 5 上使用的 ImageView 的内存