Jackson Java to JSON Object mapper изменяет имя поля

использование Jackson для преобразования объекта Java в JSON

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
jsonMessage = mapper.writeValueAsString(object);

результатом является то, что поле "участники" (которое является частью экземпляра объекта)

participants    Arrays$ArrayList<E> 

переименовывается в "participantsList"

participantsList":[{"userId":"c1f9c"}]

т. е. "список" добавляется к имени Поля. Я просмотрел документацию Джексона, но не нашел способа предотвратить это. Возможно ли это? Тестирование вышеуказанного кода в автономном проекте не приводит к тому же результату (т. е. переименование не происходит). Почему Джексон так себя ведет? К сожалению, объект является третьей стороной, и я не могу его изменить.

использование Jackson версии 2.3.3 (такое же поведение проверено с 2.9.0).

2 ответов


комментарий Александра указал в правильном направлении. Действительно, существует getParticipantsList (), который Джексон, похоже, учитывает при определении имени Поля JSON. Однако, как я писал ранее, я не могу внести какие-либо изменения, учитывая, что это объект третьей стороны.

но, с лучшим пониманием того, что вызывает проблему, я смог придумать решение:

mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY).withGetterVisibility(Visibility.NONE).withIsGetterVisibility(Visibility.NONE));

или

mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.IS_GETTER, Visibility.NONE);

возможно, вы можете использовать USE_ANNOTATIONS, чтобы пропустить аннотации следующим образом:

    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
    String jsonMessage = mapper.writeValueAsString(object);