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

oiopk7p5  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(228)

我们使用Jersey JAX-RS和Jackson(2.1.5版)开发了一个REST服务,用于JSON序列化。
由于该应用程序应该是作为现有移动的应用程序后端的旧遗留服务的直接替代品,我们需要对Jackson序列化布尔值的方式进行一些调整。
现有移动的应用程序期望布尔值表示为“true”和“false”字符串,如下所示:

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

因此,我一直在寻找一种方法来影响Jackson序列化,以将布尔值输出为字符串,但没有成功。
哦,顺便说一句,由于我们的模型类是使用JAXB类生成从xml模式生成的,所以我们不能用json注解来注解类。
我尝试用ObjectMapper注册一个模块,它为布尔对象提供了一个自定义的序列化程序,但似乎不起作用。

s5a0g9ez

s5a0g9ez1#

Jackson2.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类
//这里是设定对象Map器的地方

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

iyzzxitl2#

好的,看起来是我的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,那么这就足够了。

hl0ma9xz

hl0ma9xz3#

从2.8版开始,只需制作:

ObjectMapper mapper = new ObjectMapper()
mapper.configOverride(Boolean.class).setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING))
mapper.configOverride(boolean.class).setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING))

相关问题