Изменить регистр поля с помощью ObjectMapper

Я думаю, что мне нужно создать специалиста ObjectMapper и я не могу найти пример кода для запуска процесса.

Создатель JSON использует свойства .Net и public и поэтому использует имена полей с инициалами в верхнем регистре. Я разбираю JSON в POJO, поэтому я хотел бы использовать инициал в нижнем регистре.

В их конце:

    public class Facet
    {
        public string Name { get; set; }
        public string  Value { get; set; }
    }

Поэтому в конце я должен иметь:

    public class Facet {
        public String Name;
        public String Value;
    }

Я бы предпочел:

    public class Facet {
        public String name;
        public String value;
    }

Я прав, что это можно сделать с помощью ObjectMapper?


person OldCurmudgeon    schedule 14.09.2012    source источник
comment
Я переименовал и удалил вторую часть вопроса. Другая половина размещена здесь   -  person OldCurmudgeon    schedule 17.09.2012


Ответы (4)


Вашу первую проблему можно очень просто решить с помощью аннотации @JsonProperty:

// java-side class
public class Facet
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("Value")
    public String value;
}

Теперь ObjectMapper будет соответствовать именам полей в другом регистре. Если вы не хотите добавлять аннотации в свои классы, вы можете создать класс Mix-in, который заменит ваш Facet:

public class FacetMixIn
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("Value")
    public String value;
}

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class);

Это позволит добиться того же, не требуя дополнительных аннотаций в вашем классе Facet.

person pb2q    schedule 14.09.2012
comment
Это именно то, что я искал в части 1 :) Спасибо. Я добавил к части 2. Стало легче? - person OldCurmudgeon; 15.09.2012
comment
Я разделил исходный вопрос на два, так что теперь это полный ответ. Во что бы то ни стало измените, чтобы отразить изменение в вопросе. - person OldCurmudgeon; 17.09.2012
comment
Вот это да. Если бы я мог проголосовать за это, я бы сделал это. Только на этой неделе я потратил почти целый день на проблемы с отображением JSON, вызванные API, использующими начальные прописные буквы в некоторых параметрах. Как только я понял, что причина в том, что эти аннотации — идеальное решение. - person Brian Knoblauch; 08.06.2018
comment
@BrianKnoblauch очень рад, что помог другому разработчику - person pb2q; 09.06.2018
comment
Начиная с версии jackson 2.5, вы можете добавлять миксины просто так: objectMapper.addMixIn(Facet.class, FacetMixIn.class) - person Manthan Jamdagni; 22.05.2020

Вместо того, чтобы аннотировать каждое поле, Jackson ObjectMapper можно настроить на использование встроенного или пользовательского PropertyNamingStrategy, чтобы применить согласованный перевод между именами свойств/полей Java и именами элементов JSON.

Например:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy);
person Programmer Bruce    schedule 02.01.2013
comment
Спасибо @ProgrammerBruce за вашу дальнейшую помощь. Я проверю, как это работает, когда вернусь к работе позже в новом году. Кстати, есть ли стратегия, которая подойдет для ЛЮБОГО случая? Если нет, возможно, вы могли бы опубликовать один. Я пытаюсь иметь дело с клиентом, который может изменить свои условности в любое время. - person OldCurmudgeon; 03.01.2013
comment
В последний раз, когда я смотрел (год или около того назад), переводы имен идут только в одном направлении (либо из имен свойств/полей Java в имена элементов JSON, либо наоборот), и поэтому реализация сопоставления без учета регистра была не такой тривиальной, как иначе может быть. - person Programmer Bruce; 04.01.2013
comment
@ Хосе: это разные вещи. SnakeCaseStrategy для змеиных_кейсов_переменных - person dagnelies; 11.03.2016
comment
@arnaud действительно, извините за это. - person Jose Alban; 11.03.2016

Эту проблему можно решить с Jackson 2.5.0 следующим образом:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

Из javadoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

Функция, которая позволит более щадящую десериализацию входящего JSON. Если включено, свойства bean-компонента будут сопоставляться с использованием их эквивалентов в нижнем регистре, что означает, что любая комбинация регистра (входящие и совпадающие имена канонизируются с помощью нижнего регистра) должна работать.

Обратите внимание, что существует дополнительная нагрузка на производительность, так как входящие имена свойств перед сравнением должны быть в нижнем регистре для случаев, когда есть прописные буквы. Однако накладные расходы для имен, которые уже написаны в нижнем регистре, должны быть незначительными.

Функция отключена по умолчанию.

С: 2.5

person madx    schedule 06.08.2016
comment
Кто-нибудь сравнивал разницу в производительности с использованием аннотаций? Аннотации кажутся более безопасными, но после разговора с другими пользователями JSON (другие языки) эта здесь опция (без учета регистра) кажется нормальным ожидаемым поведением ... Джексон кажется чудаком, строго следя за регистром. - person Brian Knoblauch; 09.06.2018

Просто быстрое обновление, так как я искал тот же ответ и фрагмент кода objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

person dekay    schedule 01.05.2019
comment
Это должен быть комментарий. Если у вас еще недостаточно представителей для комментариев, спасибо за ваш вклад, но когда вы это сделаете, пожалуйста, удалите этот ответ и оставьте комментарий. - person OldCurmudgeon; 02.05.2019