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

时间:2013-10-30 09:25:20

标签: json serialization jackson

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

好的,似乎我的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);

就是这样。如果您知道如何配置ObjectMapper,那么这应该足以让您前进。