2017-03-03 141 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); 
        } 
    });