Сериализация с Jackson (JSON) – получение «Серийный анализатор не найден»?

Я получаю исключение, пытаясь сериализовать очень простой объект с помощью jacksonа. Ошибка:

org.codehaus.jackson.map.JsonMappingException: сериализатор не найден для classа MyPackage.TestA и никаких свойств, обнаруженных для создания BeanSerializer (во избежание исключения отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

Ниже приведен простой class и код для сериализации.

Может ли кто-нибудь сказать мне, почему я получаю эту ошибку?

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

Как уже было описано, конфигурация экземпляра 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"}) 

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

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

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

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

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

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

  • Кэширование изображений и отображение
  • Как использовать определения в схеме JSON (draft-04)
  • Полиморфизм с gson
  • Каков наилучший способ загрузить JSONObject из текстового файла json?
  • JSON.net сериализуется непосредственно из oledbconnection
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • Каков правильный тип контента JSON?
  • EF 4.1 - Code First - Ошибка серийной ссылки JSON
  • Использование JSON-файла в приложениях для Android-приложений
  • Как перебирать JSONObject?
  • Как отправить строку JSON в запрос POST в Go
  • Interesting Posts

    R Ошибка в операторе x $ ed: $ недействительна для атомных векторов

    Есть ли способ заставить приложение Windows всегда запускать «Монитор n»?

    Лучшая библиотека для статистики на C ++?

    Инструменты для поиска строк внутри файлов без индексирования

    Какова цель выделения определенного объема памяти для массивов в C ++?

    Почему мне разрешено использовать переменную const, определенную как размер массива в C?

    Выберите элемент, когда имя classа начинается с определенного слова

    Разница между count () и find (). Count () в MongoDB

    Почему такие вещи, как терминал Gnome, называются терминальными эмуляторами вместо «терминалов»?

    Почему объекты R не печатаются в функции или в цикле «для»?

    Зацикливание результатов `ls` в скрипте оболочки bash

    Как я могу заставить desktop.ini работать в сетевых локациях?

    Имя пользователя и пароль аутентификации Windows Python не работает

    Hostdomonster Subdomain перенаправляется на домашний сервер IP: как ssh на домашний сервер с использованием субдомена

    Не удается запустить приложение в Wifi Connection

    Давайте будем гением компьютера.