Сериализация с Jackson (JSON) - получение "Серийный анализатор не найден"?
Я получаю исключение при попытке сериализовать очень простой объект с помощью Jackson. Ошибка:
org.codehaus.jackson.map.JsonMappingException: сериализатор не найден для класс MyPackage.TestA и никаких свойств обнаружено создание BeanSerializer (чтобы избежать исключения, отключить SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Ниже приведен простой класс и код для сериализации.
Может ли кто-нибудь сказать мне, почему я получаю эту ошибку?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Ответы
Ответ 1
Как уже было сказано, конфигурация по умолчанию для экземпляра ObjectMapper
заключается в доступе только к свойствам, которые являются открытыми полями или имеют общедоступные методы получения/установки. Альтернативой изменению определения класса, чтобы сделать поле общедоступным или предоставить общедоступный метод получения/установки, является указание (для базового VisibilityChecker
) другого правила видимости свойства. Для этого в Jackson 1.9 предусмотрен удобный метод ObjectMapper.setVisibility()
. Для примера в оригинальном вопросе, я бы, вероятно, настроил это как
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Для Джексона> 2.0:
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
Для получения дополнительной информации и подробностей о связанных параметрах конфигурации я рекомендую просмотреть JavaDocs в ObjectMapper.setVisibility ObjectMapper.setVisibility()
.
Ответ 2
Для того, чтобы Jackson сериализовал этот класс, поле SomeString
должно быть либо public
(прямо сейчас это изолирование уровня пакета), либо вам нужно определить методы getter и setter для него.
Ответ 3
У меня такая же проблема в моем исходном коде. Я просто добавил
геттер
и
сеттер
проблема решена.
Ответ 4
В моем случае проблема заключалась в том, что Джексон пытался сериализовать пустой объект без атрибутов и методов.
Как было предложено в исключении, я добавил следующую строку, чтобы избежать ошибки при пустом beans:
Для Jackson 1.9
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Для Jackson 2.X
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Вы можете найти простой пример отключить jackson fail_on_empty_beans
Ответ 5
У меня была такая же проблема для дочернего класса, где у меня был контроль, объектный картограф находился в общем модуле и был недоступен. Я решил это, добавив эту аннотацию для моего дочернего класса, объект которого должен был быть сериализован.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
Ответ 6
Эта ошибка также возникает, если вы забудете добавить метод .build() в свой статус возврата.
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
Я получил следующую ошибку без метода build():
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl
Ответ 7
Если вы можете редактировать класс, содержащий этот объект, я обычно добавляю аннотацию
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
Ответ 8
Для приложений Oracle Java добавьте это после создания ObjectMapper
:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Ответ 9
SpringBoot2.0 , Я разрешаю это следующим кодом:
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
Ответ 10
Проблема может заключаться в том, что вы указали переменную как private
.
Если вы измените его на public
, он будет работать.
Лучше использовать методы getter и setter.
Это решит проблему!
Ответ 11
Я нашел по крайней мере три способа сделать это:
- Добавьте
public getters
вашей сущности, которые вы пытаетесь сериализовать; - Добавьте аннотацию в верхней части объекта, если вы не хотите, чтобы
public getters
. Это изменит значение по умолчанию для Джексона с Visbility=DEFAULT
на @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
где @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
любые модификаторы доступа; - Измените ваш
ObjectMapper
глобально, установив objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
, Этого следует избегать, если вам не нужны эти функции во всем мире.
Выберите в зависимости от ваших потребностей.
Ответ 12
Вот три варианта:
- Данные/класс, к которым был осуществлен доступ, должны быть
public
- Если не
public
, добавьте геттеры и сеттеры - Или добавьте
@JsonIgnore("context")
Ответ 13
У меня была аналогичная проблема с ленивой загрузкой через прокси-объект hibernate. Обходите его, аннотируя класс, имеющий ленивые загруженные частные свойства:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Ответ 14
Хотя я добавил геттеры и сеттеры, я получал ту же ошибку. Позже я нашел ошибку, то есть советом Сонара, я скрепил геттеры и сеттеры как защищенные, что вызывало проблему. Как только я исправил, что он работал, как ожидается.
Ответ 15
Пожалуйста, используйте это на уровне класса для боба:
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})