9

我们使用 Jersey JAX-RS 和 Jackson(版本 2.1.5)开发了一个 REST 服务,用于 JSON 序列化。

由于该应用程序应该是作为现有移动应用程序后端的旧遗留服务的替代品,因此我们需要对 Jackson 序列化布尔值的方式进行一些调整。

现有的移动应用程序期望布尔值表示为“true”和“false”字符串,如下所示:

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

所以我已经寻找一种方法来影响杰克逊序列化以将布尔值输出为字符串,但我没有成功。

哦,顺便说一句 - 因为我们的模型类是使用 JAXB 类生成从 xml 模式生成的,所以我们不能用 json 注释对类进行注释。

我试图用 ObjectMapper 注册一个模块,它为布尔对象提供了一个自定义的序列化程序,但它似乎不起作用。

4

2 回答 2

6

Jackson 2.16 原始数据类型的自定义序列化程序。您应该编写自己的序列化程序。布尔数据类型的示例代码

// 创建一个带有自定义布尔序列化器的模块

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

}

//使用 ObjectMapper 注册自定义 BooleanSerializer 类。

// 这里是我们配置对象映射器的地方

 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);
于 2016-01-12T11:58:31.693 回答
2

好的,似乎我的 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,那么这应该足以让您继续前进。

于 2013-10-30T12:21:18.147 回答