Скажем, у меня есть фасоль:
public class MyBean {
public String oneMississipi;
public int myBestFriend;
//Getters&Setters&Bears,Oh my.
}
И я использую com.fasterxml.Jackson DataBinding, чтобы преобразовать экземпляры этого pojo в json-выход... Как настроить сериализацию имен полей, и может ли это быть привязано к глобальному/классу/полевому уровню?
например, я хотел бы определить имена моих полей:
{
"one-mississipi": "two mississippi",
"my-best-friend": 42
}
Я уже провел часы в Google и даже пробирался через код Джексона, чтобы узнать, где происходит сериализация поля, но не может показаться нигде, что он может делегировать для пользовательской обработки поля.
Есть ли у кого-нибудь идеи относительно того, где эта функциональность существует, если таковая имеется? Очень признателен
Внесите PropertyNamingStrategy
и внутри методов разрешения используйте AnnotatedMethod
, AnnotatedField
или AnnotatedParameter
чтобы получить класс объявления. Затем вы можете искать любую пользовательскую аннотацию в этом классе и применять любое пользовательское именование в зависимости от этого.
Самая большая проблема с этим подходом заключается в том, что невозможно, чтобы фактический конкретный класс был сериализован или десериализован, он всегда будет возвращать класс объявления. Таким образом, невозможно будет переопределить поведение именования в подтипах для унаследованных членов, если вы не введете их в подтип.
Другим решением будет использование разных карт для классов с разными стратегиями именования. Вы можете сделать его более или менее прозрачным, создав сопоставитель верхнего уровня "маршрутизатор", который будет решать, какой экземпляр сопоставления использовать (необходимо особое внимание уделять методам настройки и другим методам, не связанным с ser/deser). Предполагая, что у вас будет конечное число стратегий, это решение также должно быть работоспособным.
Недостатком этого решения является то, что вы не сможете смешивать разные стратегии именования во время одного сеанса сериализации/десериализации.
@JsonProperty
?