java - readvalue - spring boot jackson




在Spring MVC中使用Jackson JSON時,如何默認啟用Pascal框架? (2)

我有一個使用Spring MVC創建和處理多個REST端點的項目。 我目前正在使用Jackson使用@RequestBody@ResponseBody註解來自動處理JSON的分層/反序列化。

我已經得到傑克遜的工作,所以我有一個起點。 我的問題是,我們的舊序列化手動完成,並使用帕斯卡套管,而不是駱駝套管(“MyVariable”,而不是“myVariable”),傑克遜默認駝峰套管。

我知道我可以使用@JsonProperty手動更改變量的名稱。 這就是說,我不認為將@JsonProperty添加到我的所有變量是一個可行的長期解決方案。

有沒有辦法讓傑克遜使用Pascal封裝時序列化和反序列化比使用@JsonProperty註釋?

編輯:它看起來像沒有一個乾淨的方式來做到這一點對外部。 有幾個人建議凌駕於不同的課程上,以達到我的目標。 我打開建議,我可以重寫將改變套管。 目前,我做了一個自定義的ObjectMapper,它設置了我想要的一些屬性(即Inclusion.NON_NULL )。 我還沒有找到任何可以讓我改變套管行為的地方。 有什麼想法嗎?


對於什麼是值得的,有一個Jira的問題來支持可插拔的策略; 投票可能有助於說服開發者增加支持。 正如我在評論中提到的,可以重寫內部行為,但這不是一件簡單的事情。


我最終通過覆蓋(de)序列化程序來解決這個問題。 對於那些感興趣的人,你可以自己做:

第1步。擴展BeanSerializerFactory

覆蓋_constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember)方法。 在該方法中,以任何您認為合適的方式修改name 。 為了實現Pascal封裝,我使用了這一行: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1); 。 修改name ,調用super._constructWriter

第2步。擴展BeanDeserializationFactory

覆蓋constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter)方法。 使用您在自定義BeanSerializerFactory執行的name參數做同樣的事情。

第3步。創建一個ObjectMapper

將序列化程序工廠設置為您的自定義Bean序列化程序工廠。 設置反序列化提供程序(我使用這一行: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory())) )。

而已。 在序列化或反序列化JSON時,您創建的ObjectMapper將使用您的新命名機制。





jackson