【问题标题】:Specifying the field naming policy for Jackson为 Jackson 指定字段命名策略
【发布时间】:2012-03-20 22:51:06
【问题描述】:

我有关于使用 Jackson 的 bean 到 json 序列化/反序列化的问题。以前我使用 GSON 来做到这一点,但现在我面临一个已经依赖于 Jackson 的项目,如果我可以使用手头已有的东西,我宁愿不引入新的依赖项。

所以想象一下我有一个像这样的豆子:

class ExampleBean {
   private String firstField;
   private String secondField;
   // respective getters and setters
}

然后 Jackson 将其序列化为:

{
   "firstField": "<first_field_value>",
   "secondField": "<second_field_value>"
}

我正在使用以下代码来产生上述结果:

ExampleBean bean;
...
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(outStream, bean);

但是我希望(我希望)获得以下序列化:

{
   "first_field": "<first_field_value>",
   "second_field": "<second_field_value>"
}

我特意简化了我的示例,但是我想要序列化的 bean 的层次结构很大,并且我想指定序列化的属性应始终为 snake_style(即带有下划线),并且相应的 bean 字段应始终为骆驼装。有什么方法可以强制执行此类字段/属性命名策略并在不为每个字段注释相应属性的情况下使用它们?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    是的,我找到了它(事实证明,经过 2 小时的搜索,我距离找到它只有 30 分钟的路程):

    ObjectMapper mapper = new ObjectMapper();
    mapper.setPropertyNamingStrategy(
        PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
    mapper.writeValue(outStream, bean);
    

    希望这对其他人也有帮助。

    【讨论】:

    • ObjectMapper 好像没有 setPropertyNamingStrategy 这样的方法... :(
    • @stantonk 曾经是我写评论的时候。显然它是为杰克逊 1.9 准备的。但是,我在最近的 Jackson 库中找不到等效项。如果您这样做了,请在此处写回答案,以便人们可以参考。
    • 想通了,我通过传递依赖包含了一个旧版本的 jackson,而我的 IDE 导入了错误的 :-)。
    • 你可以使用它com.fasterxml.jackson.corejackson-databind2.3.1依赖>
    【解决方案2】:

    现在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES 是不推荐使用的策略,改用SNAKE_CASE

    ObjectMapper mapper = new ObjectMapper();
    mapper.setPropertyNamingStrategy(
        PropertyNamingStrategy.SNAKE_CASE);
    mapper.writeValue(outStream, bean);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2020-10-30
      • 2013-08-21
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多