Сериализация с Jackson (JSON) – получение «Серийный анализатор не найден»?
Я получаю исключение, пытаясь сериализовать очень простой объект с помощью jacksonа. Ошибка:
org.codehaus.jackson.map.JsonMappingException: сериализатор не найден для classа MyPackage.TestA и никаких свойств, обнаруженных для создания BeanSerializer (во избежание исключения отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Ниже приведен простой class и код для сериализации.
- как загрузить файл и данные json в почтальоне
- Дезерминирование полиморфных типов с jacksonом
- Поле Gson Serialize, если оно не пустое или не пустое
- Отключить язык приложений гипертекста (HAL) в JSON?
- jackson меняет JsonIgnore динамически
Может ли кто-нибудь сказать мне, почему я получаю эту ошибку?
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(); }
- Угловое 2: получить значения нескольких проверенных флажков
- Игнорирование новых полей объектов JSON с использованием Jackson
- Преобразование строки JSON в HashMap
- Как конвертировать RDF в довольно вложенный JSON с помощью java rdf4j
- Как разбирать массив JSON с помощью Gson
- создание Hashmap из строки JSON
- Gson: Есть ли более простой способ сериализации карты
- Проводка файла и связанных данных в RESTful WebService предпочтительно в виде JSON
Как уже было описано, конфигурация экземпляра ObjectMapper
по умолчанию предназначена только для доступа к свойствам, которые являются публичными полями или имеют общедоступные геттеры / сеттеры. Альтернативой изменению определения classа для создания публичного поля или предоставления публичного геттера / сеттера является указание (для базового VisibilityChecker
) другого правила видимости свойства. Для этого Jackson 1.9 предоставляет метод удобства ObjectMapper.setVisibility()
. Для примера в исходном вопросе я, скорее всего, настрою это как
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Для получения дополнительной информации и подробных сведений о связанных параметрах конфигурации я рекомендую просмотреть JavaDocs в ObjectMapper.setVisibility ObjectMapper.setVisibility()
.
Для того, чтобы jackson сериализовал этот class, поле SomeString
должно быть public
(прямо сейчас это изолированность на уровне пакета), или вам нужно определить методы getter и setter для него.
У меня такая же проблема в исходном коде. Я просто добавил
добытчик
а также
сеттер
проблема решена.
В моем случае проблема заключалась в том, что jackson пытался сериализовать пустой объект без атрибутов и методов.
Как было предложено в исключении, я добавил следующую строку, чтобы избежать сбоя пустых бобах:
Для jacksonа 1.9
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Для jacksonа 2.X
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Вы можете найти простой пример для отключения джексона fail_on_empty_beans
Если вы можете редактировать class, содержащий этот объект, я обычно добавляю аннотацию
import com.fasterxml.jackson.annotation.JsonIgnore; @JsonIgnore NonSerializeableClass obj;
У меня была та же проблема для дочернего classа, где у меня был контроль, объект mapper был в общем модуле и был недоступен. Я решил это, добавив эту аннотацию для моего дочернего classа, объект которого должен был быть сериализован.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
Эта ошибка также возникает, если вы забудете добавить метод .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
Для приложений Oracle Java добавьте это после создания ObjectMapper
:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Проблема может заключаться в том, что вы объявили переменную как private
. Если вы измените его на public
, он будет работать.
Лучше использовать методы getter и setter.
Это решит проблему!
У меня была аналогичная проблема с ленивой загрузкой через прокси-объект hibernate. Обходите это, аннотируя class, имеющий ленивые загруженные частные свойства:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Вот три варианта:
- Доступ к данным / classу должен быть
public
- Если не
public
, добавьте геттеры и сеттеры - Или добавьте
@JsonIgnore("context")
Хотя я добавил геттеры и сеттеры, я получал ту же ошибку. Позже я нашел ошибку, то есть по совету Сонара, я скрепил геттеры и сеттеры как защищенные, что вызывало проблему. Как только я исправил, что он работал, как ожидается.
Я нашел по крайней мере три способа сделать это:
- Добавить
public getters
на сущности, которые вы пытаетесь выполнить сериализацией; - Добавьте аннотацию в верхней части объекта, если вы не хотите
public getters
. Это изменит значение по умолчанию для Jackson отVisbility=DEFAULT
до@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
где@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
любые модификаторы доступа; - Измените
ObjectMapper
глобально, установивobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
, Этого следует избегать, если вы не нуждаетесь в этой функции во всем мире.
Выберите, исходя из ваших потребностей.