【问题标题】:How to serialize boolean to JSON as strings using Jackson如何使用 Jackson 将布尔值序列化为 JSON 作为字符串
【发布时间】:2013-11-09 19:05:42
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: json serialization jackson


    【解决方案1】:

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

    【讨论】:

    • 这与接受的答案基本完全相同:stackoverflow.com/a/19682113/1712
    • 据我所知,一些小细节可能略有不同,但大体相同。
    • 谢谢。我将您的回答作为参考。我只是扩展了 JsonSerializer。我认为这是在 jackson 2.6 中创建自定义序列化程序的正确方法
    【解决方案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,那么这应该足以让您继续前进。

    【讨论】:

    • NonTypedScalarSerializerBase 类型已弃用
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2014-08-06
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多