Как сериализовать логическое значение в JSON в виде строк, используя Джексона

Мы разработали службу REST, используя Jersey JAX-RS и Jackson (версия 2.1.5) для сериализации JSON.

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

Существующее мобильное приложение ожидает, что логические значения будут выражены в виде строк «true» и «false» следующим образом:

{"Foo":"true","Bar":"false"}

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

Да, и кстати, поскольку наши классы моделей были сгенерированы из схем xml с использованием генерации классов JAXB, мы не можем аннотировать классы аннотациями json.

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


person Roland Tepp    schedule 30.10.2013    source источник


Ответы (2)


Jackson 2.16 Custom Serializer для примитивных типов данных. вы должны написать свой собственный сериализатор. пример кода для логического типа данных

// создаем модуль с собственным логическим сериализатором

class BooleanSerializer extends JsonSerializer<Boolean> {
private final static Logger logger =    LoggerFactory.getLogger(BooleanSerializer.class);
@Override
public void serialize(Boolean value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonGenerationException {
    logger.info("serializing boolean value as a Strng {}",value);
    jgen.writeString(value.toString());
}

}

//регистрируем пользовательский класс BooleanSerializer с помощью ObjectMapper.

// Здесь мы настраиваем средство сопоставления объектов

 ObjectMapper mapper = new ObjectMapper();

 SimpleModule simpleModule = new SimpleModule("BooleanAsString", new    Version(1, 0, 0, null, null, null));
    simpleModule.addSerializer(Boolean.class,new BooleanSerializer());
    simpleModule.addSerializer(boolean.class,new BooleanSerializer());

mapper.registerModule(module);
person Srinivas Bheemreddy    schedule 12.01.2016
comment
Это в основном то же самое, что и принятый ответ: stackoverflow.com/a/19682113/1712 - person Roland Tepp; 12.01.2016
comment
Из того, что я могу сказать, некоторые мелкие детали могут немного отличаться, но суть все та же. - person Roland Tepp; 13.01.2016
comment
спасибо. Я принял ваш ответ в качестве ссылки. Я просто расширяю JsonSerializer. Я думаю, что это правильный способ создать собственный сериализатор в jackson 2.6. - person Srinivas Bheemreddy; 27.01.2016

Хорошо, похоже, что либо моя IDE, либо Maven барахлили и отказывались создавать или ссылаться на изменения, которые я внес в свою ObjectMapper конфигурацию.

Ради будущих посетителей, вот суть решения проблемы привязки данных Джексона для выдачи логических значений в виде строк:

В моем настроенном преобразователе контекста ObjectMapper мне просто нужно было добавить специальный сериализатор для логических типов объектов:

// create a module with a custom Boolean serializer
SimpleModule module = new SimpleModule("BooleanAsString", new Version(1, 0, 0, null, null, null));
module.addSerializer(new NonTypedScalarSerializerBase<Boolean>(Boolean.class){
    @Override
    public void serialize(Boolean value, JsonGenerator jgen, SerializerProvider provider)
    throws IOException, JsonGenerationException {
        ObjectMapperProvider.log.debug("serializing boolean value as a Strng");
        jgen.writeString(value.toString());
    }
});
// Here's where we configure the object mapper
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

Вот и все. Если вы знаете, как настроить ObjectMapper, этого должно быть достаточно, чтобы начать работу.

person Roland Tepp    schedule 30.10.2013
comment
Тип NonTypedScalarSerializerBase‹Boolean› устарел. - person Alfredo M; 30.01.2018