2017-03-03 145 views
2

杰克逊不会用has getter方法处理我的布尔型字段。例如animal.hasLegs(),对于legs字段返回的JSON对象没有legs字段。它可以与is获取方法(person.isAwesome(),布尔字段awesome)一起使用。如何使用Jackson的布尔值命名约定?

我该如何让杰克逊使用布尔型字段的has方法命名约定?

+0

注:没有 “有” 命名约定。在JavaBean规范中定义了“is”约定(尽管这是一个例外),所以为具有“has”,“can”,“should”或任何其他类似前缀的布尔变量的获取器必然会破坏许多应用程序。尽管如此,没有什么能够阻止你创建额外的getter – Kayaman

+0

@Kayaman虽然它可能不是官方的,但使用'has'命名很常见。例如,看看这个SO问题:http://stackoverflow.com/questions/3874350/naming-conventions-for-java-methods-that-return-booleanno-question-mark – Jelle

+0

它仍然没有在规范中。如果它在规格中,它会自动工作。 – Kayaman

回答

1
  1. 标注所有需要与@JsonGetterhasXXX()方法。否则,杰克逊并没有在所有使用该属性,因为它不与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); 
        } 
    });