如何使用Jackson将布尔值序列化为字符串的JSON格式

10

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

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

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

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

我一直在寻找一种影响Jackson序列化将布尔值输出为字符串的方法,但是没有成功。

顺便说一句 - 由于我们的模型类是使用JAXB类生成从XML模式生成的,因此我们无法用JSON注解注释这些类。

我尝试使用ObjectMapper注册一个模块,该模块提供了布尔对象的自定义序列化器,但似乎并没有起作用。

3个回答

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

//注册定制的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);

这基本上与被接受的答案完全相同:https://dev59.com/GmIk5IYBdhLWcg3wAJ6E#19682113 - Roland Tepp
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Roland Tepp
谢谢。我将您的答案作为参考,只是扩展了JsonSerializer。我认为这是在jackson 2.6中创建自定义序列化器的正确方式。 - Srinivas Bheemreddy

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

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


类型 NonTypedScalarSerializerBase<Boolean> 已弃用。 - Alfredo M

1
自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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接