Сериализация с 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

Я нашел по крайней мере три способа сделать это:

  1. Добавьте public getters вашей сущности, которые вы пытаетесь сериализовать;
  2. Добавьте аннотацию в верхней части объекта, если вы не хотите, чтобы public getters. Это изменит значение по умолчанию для Джексона с Visbility=DEFAULT на @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) где @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) любые модификаторы доступа;
  3. Измените ваш ObjectMapper глобально, установив objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY); , Этого следует избегать, если вам не нужны эти функции во всем мире.

Выберите в зависимости от ваших потребностей.

Ответ 12

Вот три варианта:

  1. Данные/класс, к которым был осуществлен доступ, должны быть public
  2. Если не public, добавьте геттеры и сеттеры
  3. Или добавьте @JsonIgnore("context")

Ответ 13

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

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Ответ 14

Хотя я добавил геттеры и сеттеры, я получал ту же ошибку. Позже я нашел ошибку, то есть советом Сонара, я скрепил геттеры и сеттеры как защищенные, что вызывало проблему. Как только я исправил, что он работал, как ожидается.

Ответ 15

Пожалуйста, используйте это на уровне класса для боба:

@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})