如何使用Jackson将boolean序列化为JSON作为字符串

Rol*_*epp 6 serialization json jackson

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

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

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

{"Foo":"true","Bar":"false"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sri*_*ddy 5

用于原始数据类型的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());
}
Run Code Online (Sandbox Code Playgroud)

}

//使用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);
Run Code Online (Sandbox Code Playgroud)


Rol*_*epp 2

好吧,看来我的 IDE 或 Maven 出现故障,拒绝构建或引用我在ObjectMapper配置中所做的更改。

为了将来的访问者,以下是使 Jackson 数据绑定将布尔值吐出为字符串的问题的解决方案的要点:

在我定制的 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);
Run Code Online (Sandbox Code Playgroud)

就是这样。如果您知道如何配置 ObjectMapper,那么这应该足以让您继续下去。