Сериализация с Джексоном (JSON) - получение "Сериализатор не найден"? - PullRequest
230 голосов
/ 03 декабря 2011

Я получаю исключение при попытке сериализации очень простого объекта с использованием Джексона. Ошибка:

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();
}

Ответы [ 14 ]

295 голосов
/ 06 декабря 2011

Как уже описано, конфигурация по умолчанию для экземпляра ObjectMapper предназначена только для доступа к свойствам, которые являются открытыми полями или имеют общедоступные методы получения / установки.Альтернативой изменению определения класса, чтобы сделать поле общедоступным или предоставить общедоступный метод получения / установки, является указание (для базового VisibilityChecker) другого правила видимости свойства.Jackson 1.9 предоставляет для этого удобный метод ObjectMapper.setVisibility().Для примера в исходном вопросе я, скорее всего, настрою это как

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

Для Джексона> 2.0:

myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

Для получения дополнительной информации и подробностей о связанных параметрах конфигурации, я рекомендуюпросмотр JavaDocs на ObjectMapper.setVisibility().

69 голосов
/ 03 декабря 2011

Чтобы Джексон мог сериализовать этот класс, поле SomeString должно быть либо public (сейчас это изоляция на уровне пакета), либо вам необходимо определить методы получения и установки для него.

39 голосов
/ 12 октября 2015

У меня та же проблема в моем исходном коде.Я просто добавил

getter

и

setter

проблема решена.

22 голосов
/ 27 сентября 2014

Проблема в моем случае заключалась в том, что Джексон пытался сериализовать пустой объект без атрибутов или методов.

Как предложено в исключении, я добавил следующую строку, чтобы избежать сбоя на пустых бинах:

Для Джексона 1.9

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

Для Джексона 2.X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

Вы можете найти простой пример Джексон отключить fail_on_empty_beans

8 голосов
/ 31 января 2018

У меня была такая же проблема для дочернего класса, где у меня был контроль, объект-маппер находился в общем модуле и был недоступен.Я решил это, добавив эту аннотацию для моего дочернего класса, объект которого должен был быть сериализован.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
6 голосов
/ 16 января 2015

Если вы можете редактировать класс, содержащий этот объект, я обычно просто добавляю аннотацию

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
5 голосов
/ 07 мая 2013

Эта ошибка также выдается, если вы забыли добавить метод .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
3 голосов
/ 25 ноября 2016

Для приложений Oracle Java добавьте это после ObjectMapper:

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
2 голосов
/ 08 августа 2018

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

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

Возможно, проблема в том, что вы объявили переменную как private.Если вы измените его на public, он будет работать.

Лучше использовать для него методы получения и установки.

Это решит проблему!

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