【问题标题】:How can I use the 'has' method naming convention for booleans with Jackson?如何使用 Jackson 的布尔值的“has”方法命名约定?
【发布时间】:2017-07-23 14:38:55
【问题描述】:

Jackson 不使用 has getter 方法处理我的布尔字段。例如animal.hasLegs(),对于legs 字段返回一个没有legs 字段的JSON 对象。它确实适用于 is getter 方法(person.isAwesome() 用于布尔字段 awesome)。

如何让 Jackson 对布尔字段使用 has 方法命名约定?

【问题讨论】:

  • 注意:没有“has”命名约定。 JavaBeans 规范中定义了“is”约定(尽管这也是一个例外),因此为布尔值创建带有“has”、“can”、“should”或任何其他类似前缀的 getter 势必会破坏许多应用程序。不过,没有什么能阻止您创建额外的吸气剂。
  • @Kayaman 虽然它可能不是官方的,但使用has 命名是很常见的。例如,查看这个 SO 问题:stackoverflow.com/questions/3874350/…
  • 它仍然不在规范中。如果它在规范中,它将自动工作。
  • 你试过用@JsonProperty(value="Name of the field")注释你的getter和setter吗?
  • 遇到了杰克逊和is 命名的问题。故事的寓意...建议尽管有美学,但在任何地方都使用get作为属性。避免使用ishas 等... 以后的编码人员不会太在意,因为您需要处理序列化。如果你真的想要一个额外的动词,也许getIsSomething()。这样你的财产至少被命名为isSomething

标签: java json jackson


【解决方案1】:
  1. @JsonGetter 注释所有需要的hasXXX() 方法。否则杰克逊根本不会使用这个属性,因为它不是以get开头的:

    @JsonGetter
    public boolean hasAwesome() { ... }
    
  2. 设置自定义PropertyNamingStrategy,将映射从方法名称重命名为 JSON 字段。默认会生成名为hasXXX的JSON字段。

    ObjectMapper mapper = ...
    mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() {
        @Override
        public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
            String prefix = "has";
            if (defaultName.startsWith(prefix)) {
                String withoutHas = defaultName.replace(prefix, "");
                char firstLower = Character.toLowerCase(withoutHas.charAt(0));
                return firstLower + withoutHas.substring(1);
            }
            return super.nameForGetterMethod(config, method, defaultName);
        }
    });
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2011-06-24
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2016-12-23
    • 2010-11-18
    相关资源
    最近更新 更多